3.2(wheezy)和3.4(jessie)之间的腌制数据有什么不同?

时间:2016-06-28 20:26:29

标签: python pickle

我有一个运行在树莓派上的python 3.x客户端。它通过在PI上进行pickle并在服务器上进行unpickling,为运行winpython 3.4的服务器提供摄像机设置信息。

当pi运行wheezy和python 3.2时,这很好用,但是当我在运行jessy和python 3.4的PI上尝试它时,服务器上的unpickle失败,错误:

File "C:\Python34\Lib\site-packages\dill\dill.py", line 260, in loads
    return load(file)

  File "C:\Python34\Lib\site-packages\dill\dill.py", line 250, in load
    obj = pik.load()

  File "C:\Python34\lib\pickle.py", line 1036, in load
    dispatch[key[0]](self)

  File "C:\Python34\lib\pickle.py", line 1323, in load_global
    klass = self.find_class(module, name)

  File "C:\Python34\Lib\site-packages\dill\dill.py", line 406, in find_class
    return StockUnpickler.find_class(self, module, name)

  File "C:\Python34\lib\pickle.py", line 1373, in find_class
    __import__(module, level=0)

**ImportError: No module named 'picamera'**

从错误中可以看出,这是在我在服务器上安装Dill但我仍然得到相同的基本错误后,它无法找到picamera。

然后我在服务器上安装了PICamera,但当然这会因为它查找Raspberry I文件而失败,所以卸载它。

有谁知道是否有办法让3.4 python版本的酸洗工作与3.2版本相同?

由于

更新

@Dilettant感谢提示使用pickle工具。我在pickle中发现了一个区别:3.4版本将这个项目作为picamera条目腌制,3.2将其作为元组留下。
3.4结果 - >

530:q BINPUT 36
532:K BININT1 0
534:X BINUNICODE'决议'
549:q BINPUT 37
551:c GLOBAL' picamera.mmalobj PiCameraResolution'

 3.2 version -->

830:q BINPUT 55 832:\ x88 NEWTRUE
833:X BINUNICODE'决议'
848:q BINPUT 56
850:M BININT2 720
853:M BININT2 480
856:\ x86 TUPLE2

当我修复它时,我会发布结果

2 个答案:

答案 0 :(得分:0)

pickle是一种与要序列化的对象的python字节码紧密相关的格式。字节码可能会从python版本更改为另一个版本。因此,您只能在使用相同python版本运行的程序之间交换pickeled数据。

您可以使用json模块来序列化您的数据,以便将其发送到服务器。

答案 1 :(得分:0)

感谢@Dilettant,@ Sebastian Stigler,@ ppperry

问题是基础PiCamera类的未记录更改,提供正在被腌制的分辨率数据。最初它提供了一个元组,现在是一个'picamera.mmalobj.PiCameraResolution'对象。我添加了一个检查,看看对象是否是一个元组,并相应地处理数据。我希望这能帮助处于同一位置的其他人。

    if type(camera.resolution) == tuple:
        settings["resolution"] = camera.resolution
    else:
        settings["resolution"] = (camera.resolution.width,camera.resolution.height)