2011-01-13 22 views
6

नोट: हल किया गया। यह पता चला कि मैं एक ही मॉड्यूल के पिछले संस्करण को आयात कर रहा था।पायथन नाम त्रुटि: नाम '<anything>' परिभाषित नहीं किया गया है (लेकिन यह है!)

स्टैक ओवरव्लो पर समान विषयों को ढूंढना आसान है, जहां कोई नेमरर में भाग गया। लेकिन अधिकांश प्रश्न विशिष्ट मॉड्यूल से निपटते हैं और समाधान मॉड्यूल को अद्यतन करने के लिए अक्सर होता है।

मेरे मामले में, मैं एक मॉड्यूल से एक फ़ंक्शन आयात करने की कोशिश कर रहा हूं जिसे मैंने स्वयं लिखा था। मॉड्यूल को इन्फ्रापी नाम दिया गया है, और यह निश्चित रूप से sys.path पर है। इन्फ्रापी में एक विशेष फ़ंक्शन (listToText कहा जाता है) एक नाम त्रुटि देता है, लेकिन केवल तभी जब मैं इसे किसी अन्य स्क्रिप्ट में आयात करने का प्रयास करता हूं। इन्फ्रापी के अंदर, if __name__=='__main__': के तहत, सूची टोटेक्स्ट फ़ंक्शन बस ठीक काम करता है। इन्फ्रापी से मैं बिना किसी समस्या के अन्य कार्यों को आयात कर सकता हूं। मेरी स्क्रिप्ट में from InfraPy import * सहित कोई भी त्रुटि वापस नहीं आती है जब तक कि मैं सूचीToText फ़ंक्शन का उपयोग करने का प्रयास नहीं करता।

यह कैसे हो सकता है?
एक विशेष फ़ंक्शन को आयात करने से एक समान मॉड्यूल में अन्य सभी फ़ंक्शंस आयात करते समय, ठीक है?

MacOSX 10.6 पर अजगर 2.6 का उपयोग करना भी .NET 4.0

धन्यवाद के लिए एक ही त्रुटि विंडोज 7 पर स्क्रिप्ट चलाने, IronPython 2.6 का उपयोग कर का सामना करना पड़ा।

यदि अन्य विवरण हैं जो आपको लगता है कि इसे हल करने में मददगार होगा, तो मुझे उन्हें प्रदान करने में खुशी होगी।

के रूप में अनुरोध किया है, यहाँ समारोह परिभाषा InfraPy के अंदर है:

def listToText(inputList, folder=None, outputName='list.txt'): 
    ''' 
    Creates a text file from a list (with each list item on a separate line). May be placed in any given folder, but will otherwise be created in the working directory of the python interpreter. 
    ''' 
    fname = outputName 
    if folder != None: 
     fname = folder+'/'+fname 
    f = open(fname, 'w') 
    for file in inputList: 
     f.write(file+'\n') 
    f.close() 

इस समारोह के ऊपर और if __name__=='__main__':

की मैं कोशिश की स्क्रिप्ट के संबंध में चारों ओर InfraPy चलती गया है बाहर परिभाषित किया गया है। सबसे परेशान स्थिति यह है कि जब इन्फ्रापी उसी फ़ोल्डर में स्क्रिप्ट के रूप में है, और मैं from InfraPy import listToText का उपयोग करके आयात करता हूं, तो मुझे यह त्रुटि प्राप्त होती है: NameError: name listToText is not defined। दोबारा, अन्य कार्य ठीक आयात करते हैं, वे सभी इन्फ्रापी में if __name__=='__main__': के बाहर परिभाषित किए गए हैं।

+3

कृपया प्राप्त होने वाले सटीक त्रुटि संदेश को पोस्ट करें। – Amber

+1

क्या आप __InfraPy__ मॉड्यूल के स्रोत कोड को खरीद सकते हैं, यह यहां सहायक हो सकता है; लेकिन मेरा पहला अनुमान यह है कि हो सकता है कि आप फंक्शन __listToText__ को ब्लॉक 'if __name __ ==' __ मुख्य __ 'के पक्ष में परिभाषित करें:' क्या आप? ' – mouad

+0

मेरा सुझाव है कि आप मॉड्यूल में कार्यों और/या कक्षाओं की परिभाषाएं पोस्ट करें (यानी, 'def' या 'class' लाइनें, लेकिन निकायों के बिना), कम से कम एक जो मॉड्यूल के बाहर से सुलभ है, और जो नहीं है। –

उत्तर

3

यह अगर मॉड्यूल __all__ परिभाषित

वैकल्पिक रूप से आपकी राह में मॉड्यूल है कि बजाय एक आप

उम्मीद कर रहे हैं की आयातित हो रही का एक और संस्करण हो सकता है है हो सकता है है NameError के बारे में listToText या क्या यह अपवाद के कारण समारोह के अंदर कुछ है?

+0

धन्यवाद gnibbler, यह sys.path पर मॉड्यूल का एक और संस्करण प्रतीत होता है। जब मैं इन्फ्रापी और एक टेस्ट स्क्रिप्ट के साथ एक नया फ़ोल्डर बनाता हूं, और मेरी साइट-पैकेज निर्देशिका से कुछ .pth फ़ाइलों को हटा देता हूं, तो यह ठीक काम करता है। जब मैंने उस नए फ़ोल्डर से इन्फ्रापी को हटा दिया, और .pth फ़ाइलों को पुनर्स्थापित किया, तो मुझे वही त्रुटियां मिलीं जो इस पोस्ट को शुरू हुईं। मिला और हल हो गया। धन्यवाद! – BenjaminGolder

3

इसके अलावा __all__ परिवर्तनीय gnibbler का उल्लेख है कि आप कहीं भी आसपास InffPy.pyc फ़ाइल के साथ कोई समस्या हो सकती है।

मैं यह सुनिश्चित करने के लिए कि आप क्या हो रहा है, यह देखने के लिए InfraPy.py की परिभाषा के माध्यम से InfraPy.py फ़ाइल में पहले import pdb;pdb.set_trace() डालने की सलाह देंगे। यदि आपको ब्रेकपॉइंट नहीं मिलता है, तो आप सोचने की तुलना में एक और फाइल आयात कर रहे हैं।

आप इसे आयात करने के बाद भी dir(InfraPy) कर सकते हैं, और यह जांचें कि आप वास्तव में InfraPy.__file__ के साथ कौन सी फ़ाइल आयात कर रहे हैं।

अभी किसी भी आयात डिबगिंग संकेतों के बारे में सोच नहीं सकते हैं। ;-)

+0

धन्यवाद लेनार्ट, विशेष रूप से 'इन्फ्रापी .__ फ़ाइल__' टिप इस मामले में वास्तव में उपयोगी है। मैंने InfraPy.pyc के लिए कुछ मछली पकड़ना किया और एक ऐसा पाया जो समस्या का कारण बन रहा हो। – BenjaminGolder