之前,我在 gselu
包中的模块 gselu.py
中定义了一个 ElectrodePositionsModel
类,并将 ElectrodePositionsModel 对象 pickle 到一些文件中。
一段时间后决定重构项目,包名gselu
改为ielu
当我尝试使用 pickle.load()
解开旧的 pickle 文件时,该过程失败并出现错误,“模块”对象没有属性“ElectrodePositionsModel”。我对 Unpickler
行为的理解是,这是因为 pickle 认为它存储了 gselu.gselu.ElectrodePositionsModel
的一个实例,因此尝试从这个模块。当它不存在时,它就会放弃。
我想我应该在模块的 init.py 中添加一些东西来告诉它 gselu.gselu.ElectrodePositionsModel
在哪里,但我无法得到pickle.load()
函数给我除 'module' 之外的任何错误消息没有属性 'ElectrodePositionsModel'
我不知道我应该去哪里提供找到它的正确路径。执行 unpickling 的代码与 ElectrodePositionsModel
类位于同一模块文件 (gselu.py
) 中。
当我在 ipython session 中加载 pickle 文件并手动导入 ElectrodePositionsModel 时,它会正确加载。
我如何告诉 pickler 在哪里加载这个模块?
最佳答案
我意识到这个问题很老了,但我刚刚遇到了类似的问题。
我为解决这个问题所做的是采用旧代码并使用它解开数据。
然后,我没有直接对自定义类进行 pickle ,而是对仅包含原始 python 的 CustomClass.__dict__
进行了 pickle 。
然后可以通过以下操作轻松地将这些数据导入到新模块中
a = NewNameOfCustomClass()
a.__dict__ = pickle.load('olddata.p', 'rb')
如果您的自定义类只有标准变量(例如内置函数或 numpy 数组等),则此方法有效。
https://stackoverflow.com/questions/38980862/