pickle无法导入存在的模块?

问题描述:

为什么会发生这种情况?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.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附加搞砸了吗?

+0

** IN **'data'是什么?什么是腌制? – Andrew 2011-05-18 20:23:51

Pickle依赖于模块路径。无论你如何加载模块,如果你不惹sys.path,咸菜加载和保存应该工作。但是,如果您在一个位置执行import module.foo,并且执行了sys.path.append('module'); import foo,则您有两个不同的模块路径:首先模块路径为module.foo,而第二个模块路径仅为foo。这些都不相同,会阻止腌菜正常工作。

检查,以确保你以同样的方式导入在装载编程类作为您在节省程序。

保存:

import window 
myObj.window_obj = window.wObj 

加载

import window 
myObj = cPickle.loads(data) 

NOT:

保存:

from window import wObj 
myObj.window_obj = wObj 

加载:

import window 
myObj = cPickle.loads(data) 
+0

我有一种感觉,这两种工作。我认为问题在于我在'import module.foo'中(有效地)。在另一个我'sys.path.append('模块');导入foo'(有效)。因此路径是不同的('foo'和'module/foo'),这就是搞砸了。 – Claudiu 2011-05-18 21:11:12

+0

@Claudiu: 我有同样的问题(和解决方案),你可以发布这个答案,并接受它? (所以别人可以找到) – 2014-03-15 14:23:09