繁体   English   中英

如何在Golang中解开python对象

[英]How to unpickle a python object in Golang

我有一个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特定的格式。 AFAIK在Python之外没有腌制解析器。 您可以尝试为Go编写一个,但是很可能只会浪费大量时间和心理健康。 另一方面,确实是一个有趣的项目。

无论如何,不​​使用任何独立于语言的格式进行腌制,即可使用适合您需要的任何格式,例如xml,json,google的protobuf或自定义格式。 始终为工作选择工具,绝不会其他选择。

有没有办法可以做到这一点?

取决于您this的理解。 有很多比Pickle更好的选择-即使在纯Python环境中。 如果你明白这一点作为交换golang和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

package main

import (
    "fmt"
    "github.com/vmihailenco/msgpack"
    "io/ioutil"
)

func main() {

    buf, err := ioutil.ReadFile("data.msgp")
    if err != nil {
        panic(err)
    }

    var out map[string]interface{}
    err = msgpack.Unmarshal(buf, &out)
    if err != nil {
        panic(err)
    }

    for k, v := range out {
        fmt.Printf("key[%v] value[%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]

剩下的就是将字节序列转换为您想要的对象。

ogórek2 )是用于解码/编码Python泡菜的Go库。

保存到文件中的泡菜可以在Go中加载,如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM