【发布时间】:2012-11-15 13:29:26
【问题描述】:
我正在尝试将同事构建的项目Project A 集成到另一个 python 项目中。现在这位同事在他的代码中没有使用相对导入,而是使用了
from packageA.moduleA import ClassA
from packageA.moduleA import ClassB
因此使用cPickle 腌制课程。为了整洁,我想隐藏他 (Project A) 在我的项目中构建的包。然而,这改变了packageA 中定义的类的路径。没问题,我将使用重新定义导入
from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB
但现在取消腌制类失败并显示以下消息
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
【问题讨论】:
-
我在为 KRunner 编写插件时遇到了这个问题。 Plasma 使用的脚本引擎使用路径挂钩在我的代码所在的位置创建了一个假包。不幸的是,我找不到任何解决此问题的方法。我唯一能做的就是手动删除他们的路径挂钩,清除
sys缓存并重新导入所有内容。但是如果你有一些腌制数据,那么你必须用相同的类名取消腌制它(这意味着你必须保留from packageA.moduleA import ClassA)。请注意,取消腌制后,您可以使用正确的名称重新腌制它们。