我怎样才能挑选一个类定义?

问题描述 投票:0回答:1

我在从另一个模块中导入一个类时,遇到了麻烦。

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

python class pickle definition
1个回答
1
投票

它当然在我拥有文件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中首先,这就是为什么“它当然在同一文件夹中工作”。

© www.soinside.com 2019 - 2024. All rights reserved.