我正在尝试使用 dill 在两个不同的环境(机器学习研究和生产)之间共享对象。
一个简化的例子:
package_a/module_a.py:
class P:
def __init__(self, a, b):
self.a = a #for example a dict
self.b = b #a function
def save_A(*, path,a,b):
import dill
p = A(a,b)
dill.dump(p, open(path, "wb"))
package_a/module_b.py:
a = [1,2,3]
def b():
return 5
from module_a import save_A
save_A("test.p", a , b)
现在我正在尝试将此对象加载到不同 repo package_b/prod.py 中的不同包中:
import dill
with open("test.p",'rb') as fp:
a = dill.load(fp)
我得到的错误是:
return StockUnpickler.find_class(self, module, name)
ImportError: No module named 'module_a'
Dills 似乎尝试从调用 save 函数的模块重新导入导入。如果我将 module_b 中的内容包含在 module_a 中(例如在一个if __name__=="__main__"
块中),一切正常。但这不可行,因为有很多对象需要腌制。我正在使用 python 3.5。我真的不明白是什么原因造成的,以及为什么 dill 会记住导入路径。如果我收到一个抱怨A
不在命名空间中的错误(即使 dill 应该将类定义与实例打包),我可以理解,但这我真的无法理解。