gpt4 book ai didi

python - 使用更改的模块路径对 python 对象进行 unpickling

转载 作者:IT老高 更新时间:2023-10-28 21:01:47 25 4
gpt4 key购买 nike

我正在尝试将同事构建的项目 Project A 集成到另一个 python 项目中。现在这位同事在他的代码中没有使用相对导入,而是使用了

from packageA.moduleA import ClassA
from packageA.moduleA import ClassB

因此使用 cPickle pickle 类。为了整洁,我想隐藏他的 (Project A) 在我的项目中构建的包。然而,这会改变 packageA 中定义的类的路径。没问题,我将使用重新定义导入

from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB

但现在取消 pickle 类失败并显示以下消息

    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

最佳答案

您需要为 pickle 导入创建一个别名才能工作; WrapperPackage 包的 __init__.py 文件如下:

from .packageA import * # Ensures that all the modules have been loaded in their new locations *first*.
from . import packageA # imports WrapperPackage/packageA
import sys
sys.modules['packageA'] = packageA # creates a packageA entry in sys.modules

您可能需要创建其他条目:

sys.modules['packageA.moduleA'] = moduleA
# etc.

现在 cPickle 将在旧位置再次找到 packageA.moduleApackageA.moduleB

之后您可能需要重新编写 pickle 文件,届时将使用新的模块位置。上面创建的附加别名应确保相关模块具有新的位置名称,以便在再次编写类时使用 cPickle

关于python - 使用更改的模块路径对 python 对象进行 unpickling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13398462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com