泡菜文件只能在一台机器上工作,而在另一台机器上打开时则无效

时间:2018-08-03 10:13:44

标签: python pickle

我在通过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 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

EDIT II

我现在已经在集群上更新了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

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

编辑III

腌菜版本:据我了解,腌菜的版本与我的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”,并存储到我的计算机上,在那里我可以使用pickle还原它,而没有任何错误。

0 个答案:

没有答案