2011-05-18 118 views
3

爲什麼會發生這種情況?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

回答

4

Pickle依賴於模塊路徑。無論你如何加載模塊,如果你不惹sys.path,鹹菜加載和保存應該工作。但是,如果您在一個位置執行import module.foo,並且執行了sys.path.append('module'); import foo,則您有兩個不同的模塊路徑:首先模塊路徑爲module.foo,而第二個模塊路徑僅爲foo。這些都不相同,會阻止醃菜正常工作。

4

檢查,以確保你以同樣的方式導入在裝載編程類作爲您在節省程序。

保存:

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