使用dill来pickle一个类实例并加载到另一个包中

2024-04-25 21:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用dill在两个不同的环境(机器学习研究和生产)之间共享对象。在

一个简单的例子:

软件包/模块包:

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"))

软件包/模块包:

^{pr2}$

现在,我尝试在不同的repo中将此对象加载到不同的包中 b包/生产周期公司名称:

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函数的模块中重新导入导入。如果我将模块b中的内容包含在模块a中(例如在if __name__=="__main__"块中),那么一切都可以好吧。这个但是不可行,因为有很多对象需要进行酸洗。我使用的是python3.5。我真的不明白是什么导致了这种情况,为什么dill还记得导入路径。如果我遇到一个错误,抱怨A不在名称空间中,我可以理解(即使dill应该将类定义与实例一起打包),但这一点我真的无法理解。在


Tags: 模块path对象nameimportself名称save