2009-08-08 21 views
120

है मैं दो अजगर मॉड्यूल है:AttributeError: 'मॉड्यूल' ऑब्जेक्ट कोई विशेषता

a.py

import b 

def hello(): 
    print "hello" 

print "a.py" 
print hello() 
print b.hi() 

b.py

import a 

def hi(): 
    print "hi" 

जब मैं a.py चलाने के लिए, मैं मिलता है:

AttributeError: 'module' object has no attribute 'hi' 

क्या करना है त्रुटि का मतलब है? मैं इसे कैसे ठीक करूं?

+12

यह एक भयानक डिजाइन है। B.py आयात करता है जब यह a.py के किसी भी भाग का संदर्भ नहीं देता है? क्या आप इस समस्या को ठीक करने के लिए पूछ रहे हैं? http://stackoverflow.com/search?q=%5Bpython%5D+circular+ निर्भरता –

+0

ध्यान दें कि आपके प्रश्न इस उत्तर के समान हैं। स्पष्ट रूप से इस उत्तर में कोड सिर्फ काम करता है, लेकिन आपका नहीं है? http://stackoverflow.com/a/7336880/565879 – Buttons840

उत्तर

126

आपके पास पारस्परिक शीर्ष-स्तर के आयात हैं, जो लगभग हमेशा एक बुरा विचार है।

तुम सच में अजगर में आपसी आयात, यह एक समारोह के भीतर उन्हें आयात करने के लिए है करने के लिए जिस तरह से होना आवश्यक हैं:

# In b.py: 
def cause_a_to_do_something(): 
    import a 
    a.do_something() 

अब a.py सुरक्षित रूप से समस्याओं के कारण के बिना import b कर सकते हैं।

(दूसरा और बाद में कई बार पहली नज़र में यह प्रकट हो सकता है कि cause_a_to_do_something() बेहद अक्षम है क्योंकि यह एक import हर बार जब आप इसे कहते करता है हो सकता है, लेकिन वास्तव में आयात काम केवल पहली बार किया जाता है। यदि आप एक मॉड्यूल आयात , यह एक त्वरित ऑपरेशन है।)

+0

धन्यवाद! मुझे पहली बार पता है कि विभिन्न स्थानों पर आयात करने से ऐसा कोई फर्क पड़ता है। –

+0

कृपया ध्यान रखें कि जब फ़ंक्शन कॉल किया जाता है तो यह ओवर-हेड जोड़ता है, क्योंकि आप प्रोग्राम लोड समय के बजाय फ़ंक्शन कॉल टाइम पर आयात तर्क डालते हैं। – Rebs

+2

दिलचस्प; मुझे आश्चर्य है कि दुभाषिया इस मामले में उचित त्रुटि संदेश क्यों नहीं देता है? –

35

समस्या मॉड्यूल के बीच परिपत्र निर्भरता है। a आयात b और b आयात a आयात करता है। लेकिन उनमें से एक को पहले लोड किया जाना चाहिए - इस मामले में पाइथन ab और b.hi() से पहले मॉड्यूल प्रारंभ करने के समाप्त होता है जब आप a में इसे एक्सेस करने का प्रयास करते हैं तब तक मौजूद नहीं है।

+0

धन्यवाद! यह मैंने अनुमान लगाया है। लेकिन मुझे कुछ दस्तावेज़ों का उल्लेख नहीं मिल रहा है। यदि मुझे दो मॉड्यूल की आवश्यकता है तो एक-दूसरे से कुछ विशेषताओं को आयात करें, मुझे क्या करना चाहिए? –

+1

@ स्टीफन एचएसयू: सर्कुलर निर्भरता तोड़ना आसान है। यह कई बार एसओ पर पहले ही पूछा जा चुका है। http://stackoverflow.com/search?q=%5Bpython%5D+circular+ निर्भरता –

+0

@ एसएलॉट: धन्यवाद। मुझे बस पता है कि यह एक परिपत्र निर्भरता समस्या है। –

63

मैंने यह त्रुटि भी देखी है जब अनजाने में मॉड्यूल को मानक पायथन मॉड्यूल में से एक के नाम से नामित किया गया है। जैसे मेरे पास commands नामक एक मॉड्यूल था जो एक पायथन लाइब्रेरी मॉड्यूल भी है। यह ट्रैक करना मुश्किल साबित हुआ क्योंकि यह मेरे स्थानीय विकास पर्यावरण पर सही ढंग से काम करता था लेकिन Google App Engine पर चलते समय निर्दिष्ट त्रुटि के साथ विफल रहा।

+4

यह वह उत्तर है जिसने मेरी समस्या हल की है। – Tommy

+2

मैंने पायथन में आयात व्यवहार का प्रदर्शन करने के लिए एक परीक्षण लिखने के लिए 'abc.py' का उपयोग किया, जो मुझे बहुत काटता है ... – Bin

+0

मुझे संदेह है और .py मॉड्यूल हटा दिया गया है, लेकिन .pyc को हटाने के लिए भूल गया जो अभी भी कारण बना रहा था त्रुटि। – Echelon

14

मैं जैसे एक enum जो एक गलत तरीके से आयात किया गया था, का हवाला यह त्रुटि आई:

from package import MyEnumClass 
# ... 
# in some method: 
return MyEnumClass.Member 

सही आयात:

from package.MyEnumClass import MyEnumClass 

आशा है कि किसी को

5

मैं इस अनुभव में मदद करता है त्रुटि क्योंकि मॉड्यूल वास्तव में आयात नहीं किया गया था। कोड इस तरह दिखता था:

import a.b, a.c 

# ... 

something(a.b) 
something(a.c) 
something(a.d) # My addition, which failed. 

अंतिम पंक्ति AttributeError में हुई। कारण था कि मैं देखा कि a (a.b और a.c) की submodules थे स्पष्ट रूप से आयातित विफल रहा था, और मान लिया है कि import बयान वास्तव में a आयात किया।

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