我在从另一个模块中导入一个类时,遇到了麻烦。
Immagine我有一个文件classA.py,其定义是A类:
class A:
def execute(self):
print('Hello from class A!')
然后我有另一个文件classB.py:
import dill
import classA
class B:
def __init__(self):
self.a = classA.A()
def execute(self):
self.a.execute()
print('Hello from class B!')
b = B()
with open('/file/path', 'wb') as f:
dill.dump(b, f)
如果那时我尝试从另一个目录中取消创建文件:
with open('file/path', 'rb') as f:
b = dill.load(f)
我收到错误:
ModuleNotFoundError: No module named 'classB'
它当然在我拥有文件classA.py和classB.py的同一个文件夹中工作,因为解释器可以找到这两个类的定义。
所以我想我必须以某种方式将类的定义带入pickle文件中。我怎样才能做到这一点?
谢谢Stefano
它当然在我拥有文件classA.py和classB.py的同一个文件夹中工作,因为解释器可以找到这两个类的定义。所以我想我必须以某种方式将类的定义带入pickle文件中。我怎样才能做到这一点?
这不是它的工作原理。你没有“将类的定义带入pickle文件” - which would make no sense,因为只有类限定名被pickle(限定名=> packagename.modulename.classname)
相反,你必须确保定义类的模块在unpickling时是可导入的 - “importable”意味着包或模块的父文件夹路径在你的sys.path
中。你可以用一些方法做到这一点(使用PYTHONPATH环境变量,在你的代码中直接搞乱sys.path
- 这通常是一个坏主意,有时是正确的解决方案 - 在virtualenv中安装你的模块并激活这个virtualenv等)
注意:当前工作目录总是在你的sys.path
中首先,这就是为什么“它当然在同一文件夹中工作”。