之前我在包ElectrodePositionsModel
中的模块gselu.py
中定义了一个gselu
类,并将ElectrodePositionsModel对象腌制成一些文件。
一段时间后,决定重构该项目,并将包名gselu
更改为ielu
当我尝试用pickle.load()
取消旧的pickle文件时,该过程失败并显示错误,'module'对象没有属性'ElectrodePositionsModel'。我对Unpickler
行为的理解是,这是因为pickle认为它存储了gselu.gselu.ElectrodePositionsModel
的实例,因此尝试从此模块导入此类。当它不存在时,它会放弃。
我认为我应该在模块的 init .py中添加一些内容来告诉它gselu.gselu.ElectrodePositionsModel
的位置,但我无法获得pickle.load()
函数给我除'module' has no attribute 'ElectrodePositionsModel'
以外的任何错误消息,我无法弄清楚我应该在哪里提供找到它的正确路径。执行unpickling的代码与gselu.py
类位于同一模块文件(ElectrodePositionsModel
)中。
当我在ipython会话中加载pickle文件并手动导入ElectrodePositionsModel时,它会正确加载。
如何告诉pickler加载此模块的位置?
答案 0 :(得分:0)
我意识到这个问题很古老,但是我遇到了一个类似的问题。
我要解决的问题是采用旧代码并使用该代码释放数据。
然后,我不腌制自定义类,而是腌制仅包含原始python的CustomClass.__dict__
。
然后,可以通过执行以下操作轻松地将这些数据导入新模块中
a = NewNameOfCustomClass()
a.__dict__ = pickle.load('olddata.p', 'rb')
如果您的自定义类仅具有标准变量(例如内置变量或numpy数组等),则此方法有效。