2011-10-28 10 views
5

मुझे एक त्रुटि मिली जब मैं अचार के साथ अचार का उपयोग करता हूं। # 2 में परीक्षण के वर्ग के लिएपायथन अचार पर नामस्थान

  1. के लिए एक वर्ग मसालेदार होने के लिए,
  2. एक वर्ग जो # 1 में वर्ग का उपयोग के लिए
  3. ,
  4. unittest:

    मैं 3 प्रोग्राम फ़ाइलों में लिखा था।

और वास्तविक कोड क्रमशः निम्नानुसार हैं।

# 1। ClassToPickle.py

import pickle 
class ClassToPickle(object): 
    def __init__(self, x): 
     self.x = x 
if __name__=="__main__": 
    p = ClassToPickle(10) 
    pickle.dump(p, open('10.pickle', 'w')) 

# 2। कुछClass.py

from ClassToPickle import ClassToPickle 
import pickle 

class SomeClass(object): 
    def __init__(self): 
     self.pickle = pickle.load(open("10.pickle", 'r')) 
     self.x = self.pickle.x 
     print self.x 

if __name__ == "__main__": 
    SomeClass() 

# 3। SomeClassTest.py

import unittest 
from SomeClass import SomeClass 
from ClassToPickle import ClassToPickle # REQUIRED_LINE 

class SomeClassTest(unittest.TestCase): 
    def testA(self): 
     sc = SomeClass() 
     self.assertEqual(sc.x, 10) 

def main(): 
    unittest.main() 

if __name__ == "__main__": 
    main() 

मैंने पहले पिकल फ़ाइल बनाने के लिए # 1 प्रोग्राम चलाया।
और फिर, जब मैं अकेले प्रोग्राम फ़ाइल # 2 चलाता हूं (यानी "पायथन SomeClass.py" दर्ज करें), यह काम करता है।
और, जब मैं अकेले प्रोग्राम # 3 चलाता हूं (यानी "पायथन SomeClassTest.py" दर्ज करें), यह भी काम करता है।

हालांकि, जब मैं प्रोग्राम # 3 को ग्रहण + pydev में "यूनिट-टेस्ट" के रूप में चलाता हूं, तो यह नीचे एक त्रुटि संदेश देता है।

======================================================================
ERROR: testA (SomeClassTest.SomeClassTest)
----------------------------------------------------------------------
Traceback (most recent call last):
$ File "/home/tmp/pickle_problem/SomeClassTest.py", line 9, in testA
sc = SomeClass()
$ File "/home/tmp/pickle_problem/SomeClass.py", line 8, in init
self.pickle = pickle.load(open("10.pickle", 'r'))
$ File "/usr/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
$ File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatchkey
File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
$ File "/usr/lib/python2.7/pickle.py", line 1126, in find_class
klass = getattr(mod, name)
$ AttributeError: 'module' object has no attribute 'ClassToPickle'

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

और यह भी, जब मैं एक लाइन है कि (# 3 कार्यक्रम में लाइन 3 और "REQUIRED_LINE" के रूप में टिप्पणी की) ClassToPickle वर्ग आयात पर टिप्पणी की, यह काम करते हैं और नीचे वर्णित एक त्रुटि संदेश वापस नहीं करता है।

E
======================================================================
ERROR: testA (main.SomeClassTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "SomeClassTest.py", line 9, in testA
sc = SomeClass()
File "/home/tmp/pickle_problem/SomeClass.py", line 8, in init
self.pickle = pickle.load(open("10.pickle", 'r'))
File "/usr/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatchkey
File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/usr/lib/python2.7/pickle.py", line 1126, in find_class
klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'ClassToPickle'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

मुझे लगता है कि समस्या अजगर में नाम स्थान के बारे में है, लेकिन मैं नहीं जानता कि वास्तव में क्या हुआ और मैं इसे हल करने के लिए क्या कर सकते हैं।

मैं कैसे # 3 कार्यक्रम सही ढंग से
"इकाई-परीक्षण के रूप में (ग्रहण + Pydev में) चलाने के", और रेखा जो ClassToPickle आयात के बिना आदेश पंक्ति में # 3 कार्यक्रम चला सकता हूँ?
कृपया मेरी मदद करें। ऐसा इसलिए है क्योंकि

+0

क्या कोई अन्य 'ClassToPickle.py' फ़ाइल कहीं भी है जो इसे यहां दिखाए गए फ़ाइल के बजाय मिल सकती है? –

+0

@ थॉमसके आपकी टिप्पणी के लिए धन्यवाद, लेकिन उत्तर नहीं है। यहां दिखाए गए केवल तीन .py फाइलें निर्देशिका में हैं, और मैंने कभी भी 'ClassToPickle.py' नाम की फ़ाइल नहीं बनाई है। – fbessho

उत्तर

6

__main__.ClassToPickle != ClassToPickle.ClassToPickle, इस तरह यह के बारे में सोच:

जब आप ClassToPickle.py लिपि में ClassToPickle के वर्ग उदाहरण मसालेदार, अचार मॉड्यूल वर्ग जो मतलब है कि यह मॉड्यूल का नाम अचार जाएगा करने के लिए सभी संदर्भ अचार होगा जहां वर्ग परिभाषित किया गया था, और क्योंकि आपने स्क्रिप्ट ClassToPickle.py को निष्पादित किया था, इसका मतलब यह है कि मॉड्यूल __main__ पर सेट किया जाएगा जिसका अर्थ है कि pickle मॉड्यूल __main__.ClassToPickle उठाएगा।

और तुम मसालेदार उदाहरण यह असफल लोड करने के लिए है क्योंकि यह उदाहरण के वर्ग जो है __main__.ClassToPickle और नहीं एक है कि आप from ClassToPickle import ClassToPickle का उपयोग कर, क्योंकि इस नवीनतम ClassToPickle.ClassToPickle है आयातित नहीं मिला की कोशिश की है।

एक फिक्स एक और स्क्रिप्ट बनाने के लिए होगी जो इसे ClassToPickle.py में करने के बजाए डंपिंग को संभालेगी।

import pickle 

from ClassToPickle import ClassToPickle 

if __name__=="__main__": 
    p = ClassToPickle(10) 
    pickle.dump(p, open('10.pickle', 'w')) 
+0

आपकी व्याख्या के लिए धन्यवाद! यह सब मुझे समझ में आया, और आपकी स्क्रिप्ट कंसोल और ग्रहण दोनों में काम करती है :) – fbessho

+0

@fbessho: खुशी है कि यह सहायक था :) – mouad

संबंधित मुद्दे