2010-01-08 16 views
21

पायथन मॉड्यूल लिखते समय, क्या क्लाइंट कोड द्वारा इसे दो बार आयात करने से रोकने का कोई तरीका है? सी/सी ++ हेडर फाइलों की तरह ही:मॉड्यूल को दो बार आयात करने से कैसे रोकें?

#ifndef XXX 
#define XXX 
... 
#endif 

बहुत बहुत धन्यवाद!

उत्तर

30

पायथन मॉड्यूल कई बार आयात नहीं किया जाता है। बस दो बार आयात चलाना मॉड्यूल को फिर से लोड नहीं करेगा। अगर आप इसे पुनः लोड करना चाहते हैं, तो आपको reload कथन का उपयोग करना होगा। यहाँ एक डेमो

foo.py है एक पंक्ति

print "I am being imported" 

साथ एक मॉड्यूल यहाँ है कई आयात के प्रयास के एक स्क्रीन प्रतिलेख है और।

>>> import foo 
    Hello, I am being imported 
    >>> import foo # Will not print the statement 
    >>> reload(foo) # Will print it again 
    Hello, I am being imported 
+7

ध्यान दें कि 'पुनः लोड()' वर्ष मॉड्यूल के सभी संदर्भ अप ठीक नहीं होगा, इसलिए नहीं वास्तव में सभी कि उपयोगी है। –

+0

यह एक महत्वपूर्ण बात है। धन्यवाद। –

+1

संदर्भ: http://docs.python.org/tutorial/modules.html#more-on-modules। http://docs.python.org/reference/simple_stmts.html#the-import-statement –

13

आयात कैश किए जाते हैं, और केवल एक बार चलाते हैं। अतिरिक्त आयात केवल sys.modules में लुकअप समय खर्च करते हैं।

9

अन्य उत्तर में विनिर्दिष्ट है, अजगर आम तौर पर एक मॉड्यूल जब यह के लिए एक दूसरे इंपोर्ट स्टेटमेंट का सामना लोड नहीं होता है। इसके बजाए, यह अपने कैश किए गए संस्करण को sys.modules से इसके किसी भी कोड को निष्पादित किए बिना लौटाता है।

  • एक साधारण मॉड्यूल को प्रभावी ढंग से विभिन्न नामों के तहत एक ही मॉड्यूल के दो उदाहरणों बनाता है के रूप में मुख्य मॉड्यूल आयात करना:

    लेकिन वहाँ ध्यान देने योग्य कई नुकसान कर रहे हैं।

    ऐसा इसलिए होता है क्योंकि कार्यक्रम स्टार्टअप the main module is set up with the name __main__ के दौरान। इस प्रकार, इसे सामान्य मॉड्यूल के रूप में आयात करते समय, पायथन इसे sys.modules में नहीं ढूंढता है और इसे फिर से आयात करता है, लेकिन इसके उचित नाम के साथ दूसरी बार।

    फ़ाइल /tmp/a.py निम्नलिखित सामग्री के साथ पर विचार करें:

    # /tmp/a.py 
    import sys 
    
    print "%s executing as %s, recognized as %s in sys.modules" % (__file__, __name__, sys.modules[__name__]) 
    import b 
    

    एक और फ़ाइल /tmp/b.py है a.py के लिए एक एकल इंपोर्ट स्टेटमेंट (import a)।
    निष्पादित /tmp/a.py परिणाम निम्न उत्पादन में:

    [email protected]:/tmp$ python a.py 
    a.py executing as __main__, recognized as <module '__main__' from 'a.py'> in sys.modules 
    /tmp/a.pyc executing as a, recognized as <module 'a' from '/tmp/a.pyc'> in sys.modules 
    

    इसलिए, यह के रूप में सलाह दी here मुख्य मॉड्यूल काफी कम से कम और एक बाहरी मॉड्यूल के लिए अपनी कार्यक्षमता के सबसे निर्यात रखने के लिए सबसे अच्छा है, ।

    1. थोड़ा अलग आयात बयान विभिन्न प्रविष्टियों का उपयोग sys.path में एक ही मॉड्यूल को प्रेरित किया:

    2. This answer दो और संभव परिदृश्यों का उल्लेख है।

    3. पिछले एक के बाद मॉड्यूल का एक और आयात करने का प्रयास आधे रास्ते में विफल रहा।
+2

इससे वास्तव में समस्या को हल करने में मेरी मदद मिली, दूसरा जवाब पूरा नहीं हुआ। – Tapuzi

+1

यही वह है जिसे मैं ढूंढ रहा हूं। धन्यवाद। – bfrguci

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