2010-09-01 27 views
13

我試圖在一個模塊中醃製一個類的實例,並在另一個模塊中取出它。取出對象時出現AttributeError

這裏就是我醃製:

import cPickle 

def pickleObject(): 
    object = Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile, cPickle.HIGHEST_PROTOCOL) 


class Foo(object): 
    (...) 

這裏的地方我嘗試unpickle:

savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

,第二行上,我得到AttributeError: 'module' object has no attribute 'Foo'

任何人都看到我在做什麼錯誤?

回答

17

class Foo必須可以通過取消環境中的相同路徑導入,以便酸洗對象可以重新生成。

我認爲你的問題是,你正在執行的模塊中定義Foo作爲主(​​)。 Pickle會將路徑(不是類對象/定義!!!)序列化爲Foo,因爲它位於主模塊中。 Foo不是主要的unpickle腳本的屬性。

在這個例子中,你可以在unpickling腳本中重新定義class Foo,並且它應該可以取消。但其目的是在兩個腳本之間共享一個共同的庫,這些庫將通過相同的路徑提供。例如:在foo.py定義Foo

簡單的例子:

$ PROJECT_DIR/foo.py

class Foo(object): 
    pass 

$ PROJECT_DIR/picklefoo.py

import cPickle 
from foo import Foo 

def pickleObject(): 
    obj = Foo() 
    savefile = open('pickle.txt', 'w') 
    cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL) 


pickleObject() 

$ PROJECT_DIR/unpicklefoo.py

import cPickle 

savefile = open('pickle.txt', 'r') 
obj = cPickle.load(savefile) 
... 
+0

這樣做。感謝您的幫助,夥計們。 – Max 2010-09-01 02:02:57

3

傑里米·布朗得到正確的答案,這裏是同一個點的一個更具體的版本:

import cPickle 
import myFooDefiningModule 
def pickleObject(): 
    object = myFooDefiningModule.Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile) 

和:

import cPickle 
import myFooDefiningModule 
savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

這樣Foo生活在同一個命名空間在每一段代碼中。