模块中定义的类实例(即不是顶级)可以以某种方式进行腌制吗?

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

根据文档,这是不可能的。但我想知道是否有解决方法。

这似乎是一个非常任意的限制,会扰乱整体代码结构

我尝试暂时将我的班级移至顶层,效果符合预期。

我尝试按照下面链接中的“解决方案 3”进行操作,但这似乎不起作用: https://copyprogramming.com/howto/i-can-pickle-local-objects-if-i-use-a-衍生类

我有以下文件夹结构:

MainModule.py
libraries
 |- class_A.py
 |- processor.py
执行processor.py中的

__main__
来创建
class_A
的实例(带有数据)并对其进行pickle。

processor.py中的代码

import dill as pickle
from class_A import Class_A

data = 4
instance_of_A = Class_A(data)

path: str = r"C:\Users\ErikJ.GiesenLoo\Desktop\2023\EvdVds\instance_A.pkl"
with open(path, "wb") as file:
    pickle.dump(instance_of_A, file)

类_A中的代码

class Class_A:
    data = 0
    def __init__(self, data):
        self.data = data

MainModule中的代码:

import dill as pickle
from libraries.class_A import Class_A


path: str = r"C:\Users\ErikJ.GiesenLoo\Desktop\2023\EvdVds\instance_A.pkl"
with open(path, "rb") as file:
    instance_A = pickle.load(file)

    print(instance_A.data)

MainModule.py 然后尝试解封保存的数据,但只有当我将 class_A.py 移到库文件夹之外时,解封才有效。

错误:

ModuleNotFoundError: No module named 'class_A'
python class instance pickle dill
1个回答
0
投票

您没有打包项目,而是依赖于添加到模块搜索路径中的脚本目录的 默认行为。

libraries.class_a.Class_A

class_a.Class_A
 不同。当你pickle你的类时,它被识别为
class_A.Class_A
,当你尝试unpickle它时,
没有这样的类,只有libraries.class_A.Class_A

您应该打包并安装(也许在可编辑模式下)您的项目。那么你应该一致地使用导入。

最懒的方法是显式设置 PYTHONPATH。

processor.py

中的导入更改为:

from libraries.class_A import Class_A
然后,假设你的工作目录是包含

MainModule.py

的目录,你应该这样做:

PYTHONPATH=. python libraries/processor.py
要执行该脚本,你应该这样做:

PYTHONPATH=. python MainModule.py
执行主脚本(虽然这并不是真正必要的,只是为了保持一致性)。

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