pickle无法导入已存在的模块?

9 投票
2 回答
14949 浏览
提问于 2025-04-16 17:54

这可能是什么原因呢?

import window; print "LOADED"; data = cPickle.loads(data)

结果是:

LOADED
Traceback (most recent call last):
...
    import window; print "LOADED"; data = cPickle.loads(data)
exceptions.ImportError: No module named window

如果我用 import window 来加载模块,那是没问题的,但用 cPickle 加载时就好像不行。

这里有一些可能相关的额外信息:

我保存文件的模块在 project1\MODULE\submodule\main.py。而 window 模块在 project1\MODULE\window.pymain.py 的开头是:

import sys
sys.path.append("..\\..")
sys.path.append("..")
...
import window

我想加载的模块在 project2\project2sub\MODULE\data.py,而且没有对 sys 路径进行任何修改。

MODULE 在这两种情况下都是一样的:我想加载的模块是 project2\project2sub\MODULE\window.py

那么,sys.path 的添加会不会以某种方式搞乱这个呢?

2 个回答

6

确保你在加载程序中导入类的方式和在保存程序中是一致的。

保存:

 import window
 myObj.window_obj = window.wObj

加载:

 import window
 myObj = cPickle.loads(data)

错误:

保存:

 from window import wObj
 myObj.window_obj = wObj

加载:

 import window
 myObj = cPickle.loads(data)
11

Pickle这个东西是依赖于模块的路径的。无论你怎么加载模块,只要不去动sys.path,那么使用pickle来保存和加载数据应该是没问题的。不过,如果你在一个地方用import module.foo来导入模块,而在另一个地方用sys.path.append('module'); import foo来导入,那你就会有两个不同的模块路径:第一次导入时的路径是module.foo,而第二次只是foo。这两个路径是不一样的,这样就会导致pickle无法正常工作。

撰写回答