我很难选择从另一个模块中导入类的类。
想象一下,我有一个定义了A类的文件classA.py:
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文件中。我该怎么办?
谢谢 斯特凡诺
答案 0 :(得分:1)
它当然可以在我有文件classA.py和classB.py的文件夹中工作,因为解释器可以找到两个类的定义。 所以我想我必须以某种方式将类的定义引入pickle文件中。我该怎么办?
这不是它的工作方式。您不会“将类的定义带入pickle文件中”-which would make no sense,因为仅对类限定名进行了酸洗(限定名=> packagename.modulename.classname)
相反,您必须确保解开时定义了类的模块可导入-“ importable”表示程序包或模块的父文件夹路径在您的sys.path
中。您可以通过几种方式来做到这一点(使用PYTHONPATH环境变量,直接在代码中弄乱sys.path
-这通常是一个坏主意,有时甚至是正确的解决方案-在virtualenv中安装模块并激活此virtualenv等) )
注意:当前的工作目录始终位于您的sys.path
中的第一位,这就是为什么“它当然可以在同一文件夹中工作”的原因。