2010-09-01 7 views
13

मैं एक मॉड्यूल में एक वर्ग का एक उदाहरण अचार, दूसरे में उसका unpickle कोशिश कर रहा हूँ unpickling।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 को परिभाषित करते हैं जिसे आप मुख्य (__name__ == "__main__") के रूप में निष्पादित कर रहे हैं। पिकल मुख्य मॉड्यूल में होने के कारण Foo पर पथ (कक्षा वस्तु/परिभाषा नहीं !!!) को क्रमबद्ध करेगा। Foo मुख्य अनपिकल स्क्रिप्ट का एक विशेषता नहीं है।

इस उदाहरण में, आप अनपेक्षित स्क्रिप्ट में 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

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 जीवन कोड के प्रत्येक टुकड़े में।