我最近更改了程序的目录布局:以前,我的所有模块都位于“主”文件夹中。现在,我将它们移动到以该程序命名的目录中,并在其中放置__init__.py
以制作一个包。
现在,我的主目录中只有一个.py文件,用于启动程序,这更加整洁。
无论如何,尝试从程序的早期版本中加载 pickle 文件失败。我收到“ImportError:没有名为工具的模块”的信息-我猜这是因为我的模块以前位于主文件夹中,而现在位于whyteboard.tools中,而不仅仅是普通工具。但是,在tools模块中导入的代码与其所在的目录位于同一目录中,因此我怀疑是否需要指定软件包。
因此,我的程序目录如下所示:whyteboard-0.39.4
-->whyteboard.py
-->README.txt
-->CHANGELOG.txt
---->whyteboard/
---->whyteboard/__init__.py
---->whyteboard/gui.py
---->whyteboard/tools.py
whyteboard.py从whyteboard/gui.py启动代码块,从而启动GUI。在重新组织目录之前,绝对不会发生此酸洗问题。
最佳答案
正如pickle's docs所说,为了保存和恢复一个类实例(实际上也是一个函数),您必须遵守某些约束:
whyteboard.tools
是,而不是,即tools
的“相同模块”(即使它可以由import tools
由同一包中的其他模块导入,但最终以sys.modules
的形式与sys.modules['whyteboard.tools']
结合使用:这是绝对关键的,否则由一个人导入的同一模块在同一个程序包中与在另一个程序包中相比较,最终将产生多个且可能有冲突的条目!)。
如果您的 pickle 文件格式良好/高级(与旧的ascii格式相反,后者仅是出于兼容性原因而为默认格式),则在执行此类更改后将其迁移实际上可能是而不是,与“编辑文件”一样简单”(这是二进制&c ...!),尽管另有答案。我建议,相反,您要制作一个“点刺迁移脚本”:让它像这样对sys.modules
进行补丁...:
import sys
from whyteboard import tools
sys.modules['tools'] = tools
然后,每个文件
cPickle.load
,每个文件del sys.modules['tools']
和cPickle.dump
返回文件:sys.modules
中的临时额外条目应使 pickle 成功加载,然后再次转储它们,应使用实例类的正确模块名(删除额外的条目应确保这一点)。关于python - 更改模块目录后的Python pickle ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2121874/