繁体   English   中英

Pickle 文件在一台机器上工作,在另一台机器上打开时不起作用

[英]Pickle file works on one machine and doesn't work when opened on other

我在通过 ssh 连接的集群上远程工作。 我在那里运行一些任务,然后我使用 pickle 来保存这样的对象:

with open('tst.pkl','wb') as g:
  pickle.dump(pkl_pack, g)

然后当我仍然在集群上时,我运行 python 并输入

with open('tst.pkl','rb') as f:
  pkl_pack = pickle.load(f)

一切都很好。 当我将 .pkl 文件 scp 到我的私人计算机时出现问题

scp name@cluster:~/path/tst.pkl ./

然后我运行与我在集群上使用的相同版本的 python (python.3.5.2) 并执行相同的命令

with open('tst.pkl','rb') as f:
  pkl_pack = pickle.load(f)

但在我的机器上它产生一个错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "stringsource", line 15, in tenpy.linalg.np_conserved.Array.__setstate_cython__
TypeError: Expected tuple, got dict

在这里我不能再处理数据了。

在集群和我的私人计算机上,我都有相同版本的 python 以及我使用的库(tenpy)。

如果我尝试以相反的方式执行此操作(保存在我的计算机上并在群集上还原),则会发生同样的情况,但是错误是不同的:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: Can't get attribute '__pyx_unpickle_Array' on <module 'tenpy.linalg.np_conserved' from '/home/pwojcik/usr/lib/TeNPy/tenpy/linalg/np_conserved.py'>

在加载泡菜文件之前导入库没有帮助。

编辑

tenpy 库允许检查版本:

>>> print(tenpy.__full_version__)
b'v0.3.0\n' using python 3.5.2 (default, Aug  2 2018, 16:42:25) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] with numpy 1.15.0, scipy 1.1.0

并且 GCC 在我的电脑上有所不同

>>> print(tenpy.__full_version__)
b'v0.3.0\n' using python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] with numpy 1.15.0, scipy 1.1.0

编辑二

我现在已经更新了集群上的 GCC 版本

>>> print(tenpy.__full_version__)
b'v0.3.0\n' using python 3.5.2 (default, Aug  7 2018, 10:27:13) 
[GCC 5.4.0] with numpy 1.15.0, scipy 1.1.0

但泡菜仍然产生相同的错误。

编辑三

Pickle 版本:据我所知,pickle 与我的 python 版本相同。 命令

$ pip3 freeze | grep pickle

在我的电脑上执行时,我得到了

cloudpickle==0.5.3
pickleshare==0.7.4

集群上什么也没有。 所以我在集群上安装了上述包

pip3 install cloudpickle 
pip3 install pickleshare 

但问题仍然存在。 我还用 matplotlib.pyplot 进行了泡菜测试

import matplotlib.pyplot as plt
import pickle

data = plt.plot([0],[1])

with open('plot.pkl','wb') as g:
    pickle.dump(data,g)

在集群上准备了一个文件“plot.pkl”,scp-ied 到我的计算机,在那里我能够使用 pickle 恢复它而没有任何错误。

暂无
暂无

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

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