我有一个代码框架,涉及使用dill转储会话。这曾经工作得很好,直到我开始使用熊猫。以下代码在CentOS版本6.5上引发了PicklingError:
import pandas
import dill
dill.dump_session('x.dat')
问题似乎源于pandas.algos。事实上,运行它可以重现错误:
import pandas.algos
import dill
dill.dump_session('x.dat') / dill.dumps(pandas.algos)
错误为pickle.PicklingError: Can't pickle <cyfunction lambda1 at 0x1df3050>: it's not found as pandas.algos.lambda1
。
问题是,我的电脑上没有出现此错误。它们都有相同版本的pandas(0.14.1),dill(0.2.1)和python(2.7.6)。
查看坏对象,我得到:
>>> dill.detect.badobjects(pandas.algos, depth = 1)
{'__builtins__': <module '__builtin__' (built-in)>,
'_return_true': <cyfunction lambda2 at 0x1484d70>,
'np': <module 'numpy' from '/usr/local/lib/python2.7/site-packages/numpy-1.8.2-py2.7-linux-x86_64.egg/numpy/__init__.pyc'>,
'_return_false': <cyfunction lambda1 at 0x1484cc8>,
'lib': <module 'pandas.lib' from '/home/talkr/.local/lib/python2.7/site-packages/pandas/lib.so'>}
这似乎是由于两个操作系统(可能是不同的编译器?)对pandas.algos
的不同处理。在我的PC上,dump_session
没有错误,pandas.algos._return_false
为<cyfunction <lambda> at 0x06DD02A0>
,而在CentOS上<cyfunction lambda1 at 0x1df3050>
。为什么处理方式不同?