python - 重构模块名称后unpickle实例

之前,我在 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/

相关文章:

javascript - d3 读取输入值

python - 如何更改seaborn jointplot中注释的字体大小?

macos - 如何让 macOS 虚拟机以安全模式启动?

modelica - 在 Dymola/Modelica 中访问经过验证的函数库(例如贝塞尔函数)

oracle-sqldeveloper - 我可以将我的数据源从 SQLDeveloper 导入到

android - 错误你已经拥有这个项目

java - org.springframework.security.authentication

apache-spark - 从 pyspark 矩阵分解模型中检索潜在因子

macos - OSX - 已签名的安装程序被拒绝

emacs - emacs cider/paredit/clojure-mode 中的缩进配置