重构模块名称后的unpickle实例

时间:2016-08-16 17:17:37

标签: python module pickle

之前我在包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加载此模块的位置?

1 个答案:

答案 0 :(得分:0)

我意识到这个问题很古老,但是我遇到了一个类似的问题。

我要解决的问题是采用旧代码并使用该代码释放数据。 然后,我不腌制自定义类,而是腌制仅包含原始python的CustomClass.__dict__。 然后,可以通过执行以下操作轻松地将这些数据导入新模块中

a = NewNameOfCustomClass()
a.__dict__ = pickle.load('olddata.p', 'rb')

如果您的自定义类仅具有标准变量(例如内置变量或numpy数组等),则此方法有效。