这是一个有趣的失败。请注意,如果您这样做dill.dumps(foo)
你会得到模块的内容foo
…失败的部分是使用 python 的内置导入钩子(__import__
)除了将模块注册到sys.modules
。应该可以解决这个问题并修改dill
这样,如果在 PYTHONPATH 中找不到该模块,则可以导入该模块。但是,我确实认为必须在 PYTHONPATH 中找到该模块是正确的……这就是对模块的期望……所以我不确定这是否是一个好主意。但这可能是...
如上所述,对于一个文件foo.py
,内容:hello = "hello world, I am foo"
>>> import dill
>>> import foo
>>> dill.dumps(foo)
'\x80\x02cdill.dill\n_import_module\nq\x00U\x03fooq\x01\x85q\x02Rq\x03}q\x04(U\x08__name__q\x05h\x01U\x08__file__q\x06U\x06foo.pyq\x07U\x05helloq\x08U\x15hello world, I am fooq\tU\x07__doc__q\nNU\x0b__package__q\x0bNub.'
您可以看到文件的内容被保存在pickle中。
使用的主要原因dill
与模块,是dill
可以记录对模块的动态修改。例如,添加函数或其他对象:
>>> import foo
>>> import dill
>>> foo.a = 100
>>> with open('foo.pkl', 'w') as f:
... dill.dump(foo, f)
...
>>>
然后重新启动...(与foo
在Python路径中)
Python 2.7.10 (default, May 25 2015, 13:16:30)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('foo.pkl', 'r') as f:
... foo = dill.load(f)
...
>>> foo.hello
'hello world, I am foo'
>>> foo.a
100
>>>
我已将其添加为错误报告/功能请求:https://github.com/uqfoundation/dill/issues/123 https://github.com/uqfoundation/dill/issues/123