我在通过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还原它,而没有任何错误。