पायथन मॉड्यूल लिखते समय, क्या क्लाइंट कोड द्वारा इसे दो बार आयात करने से रोकने का कोई तरीका है? सी/सी ++ हेडर फाइलों की तरह ही:मॉड्यूल को दो बार आयात करने से कैसे रोकें?
#ifndef XXX
#define XXX
...
#endif
बहुत बहुत धन्यवाद!
पायथन मॉड्यूल लिखते समय, क्या क्लाइंट कोड द्वारा इसे दो बार आयात करने से रोकने का कोई तरीका है? सी/सी ++ हेडर फाइलों की तरह ही:मॉड्यूल को दो बार आयात करने से कैसे रोकें?
#ifndef XXX
#define XXX
...
#endif
बहुत बहुत धन्यवाद!
पायथन मॉड्यूल कई बार आयात नहीं किया जाता है। बस दो बार आयात चलाना मॉड्यूल को फिर से लोड नहीं करेगा। अगर आप इसे पुनः लोड करना चाहते हैं, तो आपको 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
आयात कैश किए जाते हैं, और केवल एक बार चलाते हैं। अतिरिक्त आयात केवल sys.modules
में लुकअप समय खर्च करते हैं।
अन्य उत्तर में विनिर्दिष्ट है, अजगर आम तौर पर एक मॉड्यूल जब यह के लिए एक दूसरे इंपोर्ट स्टेटमेंट का सामना लोड नहीं होता है। इसके बजाए, यह अपने कैश किए गए संस्करण को 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 मुख्य मॉड्यूल काफी कम से कम और एक बाहरी मॉड्यूल के लिए अपनी कार्यक्षमता के सबसे निर्यात रखने के लिए सबसे अच्छा है, ।
sys.path
में एक ही मॉड्यूल को प्रेरित किया:This answer दो और संभव परिदृश्यों का उल्लेख है।
ध्यान दें कि 'पुनः लोड()' वर्ष मॉड्यूल के सभी संदर्भ अप ठीक नहीं होगा, इसलिए नहीं वास्तव में सभी कि उपयोगी है। –
यह एक महत्वपूर्ण बात है। धन्यवाद। –
संदर्भ: http://docs.python.org/tutorial/modules.html#more-on-modules। http://docs.python.org/reference/simple_stmts.html#the-import-statement –