pickle无法导入存在的模块?

时间:2011-05-18 20:05:48

标签: python module import 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.pywindow模块为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 个答案:

答案 0 :(得分:4)

检查以确保您在加载编程中导入类的方式与保存程序中的方法相同。

保存:

 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)

答案 1 :(得分:4)

Pickle取决于模块路径。无论你如何加载模块,如果你没有弄乱sys.path,那么pickle加载和保存应该有效。但是,如果你在一个地方和import module.foo进行sys.path.append('module'); import foo,则会有两个不同的模块路径:在第一个实例中,模块路径为module.foo,而在第二个实例中,它只是foo 1}}。这些并不等同,这将阻止泡菜正常工作。