根据文档,这是不可能的。但我想知道是否有解决方法。
这似乎是一个非常任意的限制,会扰乱整体代码结构
我尝试暂时将我的班级移至顶层,效果符合预期。
我尝试按照下面链接中的“解决方案 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'
您没有打包项目,而是依赖于添加到模块搜索路径中的脚本目录的 默认行为。
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
执行主脚本(虽然这并不是真正必要的,只是为了保持一致性)。