使用dill来pickle类实例并加载到不同的包中

时间:2017-09-11 13:40:52

标签: python dill

我正在尝试使用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_a中包含来自module_b的内容(例如在if __name__=="__main__"块中),一切正常。但这是不可行的,因为有很多对象需要被腌制。我使用的是python 3.5。我真的不明白可能导致这种情况的原因以及为什么dill会记住导入路径。我可以理解,如果我抱怨A没有进入命名空间(即使dill应该用实例打包类定义),但是这个我真的不能理解。

0 个答案:

没有答案