Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Golang中取消勾选python对象_Python_Go_Pickle - Fatal编程技术网

如何在Golang中取消勾选python对象

如何在Golang中取消勾选python对象,python,go,pickle,Python,Go,Pickle,我有一个python程序,其中我使用Pickle存储对象,使用以下命令: pickle.dump(sample, open( "Pickled_files/sample.p", "wb" )) 我可以使用以下方法在Python中提取和取消拾取此对象: sample_extracted= pickle.load(open( "Pickled_files/sample.p", "rb" )) 但是,我需要在Golang应用程序中提取此对象。因此,我需要知道一种在Golang中提取使用Pytho

我有一个python程序,其中我使用Pickle存储对象,使用以下命令:

pickle.dump(sample, open( "Pickled_files/sample.p", "wb" )) 
我可以使用以下方法在Python中提取和取消拾取此对象:

sample_extracted= pickle.load(open( "Pickled_files/sample.p", "rb" ))
但是,我需要在Golang应用程序中提取此对象。因此,我需要知道一种在Golang中提取使用Python处理的对象的方法


有没有办法做到这一点?如果是的话,如果有人能给我提供一个示例参考或示例,我将不胜感激。

Pickle是Python特有的格式。另外,Python之外没有pickle解析器。你可以试着为围棋写一本,但你很可能只会浪费很多时间和精神健康。另一方面,这确实是一个有趣的项目

无论如何,不要使用任何与语言无关的格式,如xml、json、google的protobuf,甚至是定制的,任何适合您需要的格式。总是为一项工作挑选工具,而不是其他方式

有没有办法做到这一点

取决于您对此的理解。即使在纯Python环境中,也有很多比Pickle更好的选项。如果你理解这是在Gangon和Python之间交换数据,你应该考虑下面的例子:

可以用Python序列化所有内容,如

import msgpack
import msgpack_numpy as m
m.patch()
import numpy as np

data = {'string': 'Hello World',
        'number': 42,
        'matrix': np.random.randn(2, 3)}

with open('data.msgp', 'wb') as f:
    f.write(msgpack.packb(data, use_bin_type=True))

阅读它很简单

//go get-u github.com/vmihailenco/msgpack
包干管
进口(
“fmt”
“github.com/vmihailenco/msgpack”
“io/ioutil”
)
func main(){
buf,err:=ioutil.ReadFile(“data.msgp”)
如果错误!=零{
恐慌(错误)
}
变量输出映射[字符串]接口{}
err=msgpack.Unmarshal(buf,&out)
如果错误!=零{
恐慌(错误)
}
对于k,v:=范围外{
fmt.Printf(“键[%v]值[%v]\n”,k,v)
}
}
这给你

key[matrix] value[map[data:[145 106 174 12 61 187 235 63 128 225 138 214 167 154 231 191 156 205 144 51 50 116 244 191 251 147 235 33 187 149 251 63 207 56 134 174 206 146 220 63 7 23 246 148 34 235 226 63] type:[60 102 56] 
            kind:[] nd:true shape:[2 3]]]
key[string] value[[72 101 108 108 111 32 87 111 114 108 100]]
key[number] value[42]
剩下的就是将字节序列转换成您想要的对象。

()是用于解码/编码Python pickle的Go库

保存到文件中的pickle可以按如下方式加载到Go中:

f, err := os.Open("Pickled_files/sample.p")

d := ogórek.NewDecoder(f)
obj, err := d.Decode()

Pickle是Python的东西。我建议改用
json
,它可以用任何语言打开。正确的答案是停止使用
pickle
存储对象,并使用Python和Go都支持的标准交换格式。但是,如果您已经有大量需要从Go访问的
pickle
d数据,我意识到这并没有帮助。在这种情况下,我建议编写一个简单的Python实用程序,首先对数据进行重新序列化。一般来说,不可能在Go中进行解密,因为
pickle
旨在序列化Python对象,而不仅仅是数据。例如,您将如何在Go中剥离一个Python类,以及可能包含的所有Python特定语义?flatbuffer、protobuf或我最喜欢的格式msgpack比pickle做得更好。当然,如果给一个pickle文件,这些都没有帮助。黄瓜规则!