我没有看到您在 Mac 上看到的内容。这是我看到的,使用相同版本的pandas。我确实看到您使用的是不同版本的 dill。我正在使用来自 github 的版本。我会检查是否对在 dill 中保存模块或全局变量进行了调整,这可能会对某些发行版产生影响。
Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> import dill
>>> dill.detect.trace(True)
>>> dill.dump_session('x.pkl')
M1: <module '__main__' (built-in)>
F2: <function _import_module at 0x1069ff140>
D2: <dict object at 0x106a0b280>
M2: <module 'dill' from '/Users/mmckerns/lib/python2.7/site-packages/dill-0.2.2.dev-py2.7.egg/dill/__init__.pyc'>
M2: <module 'pandas' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/__init__.pyc'>
这是我得到的pandas.algos,
Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas.algos
>>> import dill
>>> dill.dumps(pandas.algos)
'\x80\x02cdill.dill\n_import_module\nq\x00U\x0cpandas.algosq\x01\x85q\x02Rq\x03.'
这是我得到的pandas.algos._return_false:
Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> import pandas.algos
>>> dill.dumps(pandas.algos._return_false)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mmckerns/lib/python2.7/site-packages/dill-0.2.2.dev-py2.7.egg/dill/dill.py", line 180, in dumps
dump(obj, file, protocol, byref, file_mode, safeio)
File "/Users/mmckerns/lib/python2.7/site-packages/dill-0.2.2.dev-py2.7.egg/dill/dill.py", line 173, in dump
pik.dump(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 317, in save
self.save_global(obj, rv)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <cyfunction lambda1 at 0x10d403cc8>: it's not found as pandas.algos.lambda1
所以,我现在可以重现您的错误。
根据它的构建方式,这看起来像是一个不可拾取的对象。 但是,它应该可以在模块内腌制……就像我一样。您似乎已经确定了您在 Pandas 在 CentOS 上构建的对象中看到的区别。
查看pandas 代码库,pandas.algos 是一个pyx 文件……所以这是cython。
这是代码。
_return_false = lambda self, other: False
如果在.py 文件中,我知道它会序列化。我不知道dill 如何为cython 生成的 lambdas 工作……(例如 lambda cyfunction)。
看起来有一个提交 (https://github.com/pydata/pandas/commit/73c71dfca10012e25c829930508b5d6f7ccad5ff),其中 _return_false 被移出一个类进入模块范围。你在 CentOS 和你的 PC 上都看到了吗?可能是针对不同发行版的 v0.14.1 被切断了略有不同的 git 版本……取决于您安装 pandas 的方式。
显然,我可以通过尝试获取对象的源来获取lambda1……对于 lambda,如果它无法获取源,dill 将按名称获取……显然它被命名为 @ 987654343@… 即使它没有出现在 .pyx 文件中。也许是因为cython 是如何构建 lambdas 的。
Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas.algos
>>> import dill
>>> dill.source.importable(pandas.algos._return_false)
'from pandas import lambda1\n'
差异可能来自cython...,因为代码是从pandas 中的.pyx 生成的。你的cython 是什么版本?我的是 0.20.2。