我最近更改了程序的目录布局:之前,我将所有模块都放在“main”文件夹中。现在,我已将它们移动到以程序命名的目录中,并放置了一个__init__.py
在那里制作一个包裹。
现在,我的主目录中有一个 .py 文件,用于启动我的程序,这更加简洁。
不管怎样,尝试从我的程序的早期版本加载腌制文件失败了。我收到“ImportError:没有名为工具的模块” - 我猜这是因为我的模块以前位于主文件夹中,现在位于 Whyteboard.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。在目录重新组织之前,这个酸洗问题肯定不会发生。
As pickle 的文档比如说,为了保存和恢复类实例(实际上也是一个函数),您必须遵守某些约束:
pickle 可以拯救和恢复阶级
实例透明,但是
类定义必须是可导入的
并住在同一个模块中
对象已存储
whyteboard.tools
is not“相同的模块”tools
(尽管它可以通过导入import tools
通过同一包中的其他模块,它最终会出现在sys.modules
as sys.modules['whyteboard.tools']
:这绝对是至关重要的,否则同一包中的一个模块与另一个包中的一个模块导入的相同模块最终会出现多个且可能冲突的条目!)。
如果您的 pickle 文件采用良好/高级格式(而不是仅出于兼容性原因而默认的旧 ascii 格式),则在执行此类更改后迁移它们实际上可能not尽管另一个答案表明了这一点,但它与“编辑文件”(这是二进制的 &c...!)一样微不足道。相反,我建议您制作一些“pickle 迁移脚本”:让它修补sys.modules
像这样...:
import sys
from whyteboard import tools
sys.modules['tools'] = tools
进而cPickle.load
每个文件,del sys.modules['tools']
, and cPickle.dump
每个加载的对象返回文件:临时的额外条目sys.modules
应该让泡菜成功加载,然后再次转储它们应该为实例的类使用正确的模块名称(删除额外的条目应该确保这一点)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)