我正在尝试将同事构建的 Project A
集成到另一个 Python 项目中。现在这位同事在他的代码中没有使用相对导入,而是采用了
from packageA.moduleA import ClassA
from packageA.moduleA import ClassB
结果因此使用cPickle
对类进行了串行化。为了整洁,我希望隐藏他的(A项目
)构建的程序包在我的项目中。然而这会改变packageA
中定义的类的路径。没问题,我将使用以下方式重新定义导入:
and consequently pickled the classes with cPickle
. For neatness I'd like to hide the package that his (Project A
) built inside my project. This however changes the path of the classes defined in packageA
. No problem, I'll just redefine the import using
from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB
但现在使用 unpickling 类时会出现以下错误信息
with open(fname) as infile: self.clzA = cPickle.load(infile)
ImportError: No module named packageA.moduleA
所以为什么cPickle
似乎看不到模块定义。我需要将packageA
的根目录添加到系统路径中吗?这是解决问题的正确方式吗?
cPickled
文件大致如下:ccopy_reg
_reconstructor
p1
(cpackageA.moduleA
ClassA
p2
c__builtin__
object
p3
NtRp4
旧的项目层次结构是这样的
packageA/
__init__.py
moduleA.py
moduleB.py
packageB/
__init__.py
moduleC.py
moduleD.py
我想把所有东西放进一个WrapperPackage
中。
MyPackage/
.. __init__.py
.. myModuleX.py
.. myModuleY.py
WrapperPackage/
.. __init__.py
.. packageA/
.. __init__.py
.. moduleA.py
.. moduleB.py
.. packageB/
.. __init__.py
.. moduleC.py
.. moduleD.py
sys
缓存并重新导入所有内容。但如果你有一些被pickle的数据,那么你必须使用相同的类名来unpickle它(这意味着你必须保留from packageA.moduleA import ClassA
)。 请注意,一旦unpickled,您可以使用正确的名称重新pickle它们。 - Bakuriu