pickle无法导入已存在的模块?
这可能是什么原因呢?
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.py
。 main.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无法正常工作。