我有一个运行在树莓派上的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
当我修复它时,我会发布结果
答案 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)