इस सवाल के बावजूद कई बार पूछा गया और जवाब दिया गया (जैसे, यहाँ , यहाँ , यहाँ , और यहाँ ) मेरी राय में कोई मौजूदा जवाब पूरी तरह से या छिपकर -m
ध्वज के सभी निहितार्थों को नहीं पकड़ता है । इसलिए, जो पहले आया है उस पर सुधार करने का प्रयास करेगा।
परिचय (TLDR)
-m
आदेश उन सभी नहीं बहुत कुछ जरूरी हर समय की आवश्यकता होगी है। संक्षेप में: (1) अजगर लिपियों को फाइलनाम (2) के बजाय मोडुलनेम के माध्यम से निष्पादित करने की अनुमति देता है (2) किसी को रिज़ॉल्यूशन के लिए जोड़ने के sys.path
लिए निर्देशिका चुनने की अनुमति देता है import
और (3) पायथन स्क्रिप्ट को कमांड लाइन से निष्पादित करने के लिए सापेक्ष आयात की अनुमति देता है। ।
प्रारंभिक
-m
ध्वज को समझाने के लिए हमें पहले थोड़ी शब्दावली स्पष्ट करनी चाहिए।
सबसे पहले, पायथन की प्राथमिक संगठनात्मक इकाई को एक मॉड्यूल के रूप में जाना जाता है । मॉड्यूल दो फ्लेवर में आता है: कोड मॉड्यूल और पैकेज मॉड्यूल। एक कोड मॉड्यूल किसी भी फ़ाइल है जिसमें अजगर निष्पादन योग्य कोड होता है। एक पैकेज मॉड्यूल एक निर्देशिका है जिसमें अन्य मॉड्यूल (या तो कोड मॉड्यूल या पैकेज मॉड्यूल) होते हैं। सबसे सामान्य प्रकार के कोड मॉड्यूल *.py
फाइलें हैं जबकि सबसे सामान्य प्रकार के पैकेज मॉड्यूल निर्देशिकाएं हैं जिनमें __init__.py
फ़ाइल होती है।
दूसरा, सभी मॉड्यूल को विशिष्ट रूप से दो अलग-अलग तरीकों से पहचाना जा सकता है: <modulename>
और <filename>
। मॉड्यूल अक्सर पायथन कोड (जैसे, import <modulename>
) में modulename और कमांड लाइन (जैसे, python <filename>
) पर फ़ाइल नाम से पहचाने जाते हैं । सभी पायथन दुभाषिए मॉडुलेनाम को अच्छी तरह से परिभाषित नियमों के एक सेट के माध्यम से फ़ाइल नाम में बदल सकते हैं। ये नियम sys.path
चर पर टिका होता है और इसलिए इस मान को बदलकर मैपिंग को बदला जा सकता है (अधिक जानकारी के लिए यह पीईपी 302 कैसे देखा जाता है )।
तीसरा, सभी मॉड्यूल (कोड और पैकेज दोनों) निष्पादित किए जा सकते हैं (जिसके द्वारा हम मॉड्यूल से जुड़े कोड का अर्थ पायथन इंटरप्रेटर द्वारा मूल्यांकन किया जाएगा)। निष्पादन विधि, और मॉड्यूल प्रकार के आधार पर, किस कोड का मूल्यांकन किया जाता है, और कब, काफी बदल सकता है। उदाहरण के लिए, यदि कोई पैकेज मॉड्यूल का निष्पादन करता है, तो python <filename>
उसके <filename>/__init__.py
बाद मूल्यांकन किया जाएगा <filename>/__main__.py
। दूसरी ओर, यदि कोई उसी पैकेज मॉड्यूल को निष्पादित करता है, import <modulename>
तो केवल पैकेज __init__.py
निष्पादित किए जाएंगे।
का ऐतिहासिक विकास -m
सबसे पहले झंडे को पायथन 2.4.1 में पेश किया गया था । प्रारंभ में इसका एकमात्र उद्देश्य एक निष्पादन मॉड्यूल को निष्पादित करने के लिए वैकल्पिक साधन प्रदान करना था। यही है, अगर हम एक मॉड्यूल के लिए दोनों <filename>
और जानते थे <modulename>
तो निम्नलिखित दो कमांड बराबर थे: python <filename> <args>
और python -m <modulename> <args>
। इसके अतिरिक्त, PEP 338 के अनुसार -m
केवल इस पुनरावृत्ति ने शीर्ष स्तर के मॉडुलेनेम्स के साथ काम किया (यानी, ऐसे मॉड्यूल जो बिना किसी हस्तक्षेप के सीधे sys.path पर पाए जा सकते हैं)।
के पूरा होने के साथ पीईपी 338-m
कार्यक्षमता समर्थन करने के लिए बढ़ाया गया था <modulename>
शीर्ष स्तर modulenames परे अभ्यावेदन। इसका मतलब ऐसे नाम http.server
थे जो अब पूरी तरह से समर्थित थे। इस वृद्धि का मतलब यह भी था कि मॉड्यूल में सभी पैकेज अब लोड किए गए थे (यानी, सभी पैकेज __init__.py
फ़ाइलों का मूल्यांकन किया गया था), मॉड्यूल के साथ ही।
पीईपी 366 के लिए अंतिम प्रमुख फीचर एन्हांसमेंट -m
आया । इस अद्यतन के साथ न केवल पूर्ण आयात बल्कि स्पष्ट सापेक्ष आयात का समर्थन करने की क्षमता प्राप्त हुई। यह कमांड में नामित मॉड्यूल के लिए चर को संशोधित करके हासिल किया गया था ।-m
__package__
-m
बक्सों का इस्तेमाल करें
-M ध्वज के लिए दो उल्लेखनीय उपयोग के मामले हैं:
कमांड लाइन से मॉड्यूल निष्पादित करने के लिए जिसके लिए किसी को अपना फ़ाइल नाम नहीं पता हो सकता है। यह उपयोग मामला इस तथ्य का लाभ उठाता है कि पायथन दुभाषिया जानता है कि मॉडुलेनेम को फ़ाइल नाम में कैसे बदलना है। यह विशेष रूप से फायदेमंद होता है जब कोई कमांड लाइन से stdlib मॉड्यूल या 3-पार्टी मॉड्यूल चलाना चाहता है। उदाहरण के लिए, बहुत कम लोग http.server
मॉड्यूल के लिए फ़ाइल नाम जानते हैं, लेकिन ज्यादातर लोग इसके मॉड्यूलनाम को जानते हैं इसलिए हम कमांड लाइन का उपयोग करके इसे निष्पादित कर सकते हैं python -m http.server
।
इसे स्थापित करने की आवश्यकता के बिना पूर्ण आयात वाले स्थानीय पैकेज को निष्पादित करने के लिए। यह उपयोग मामला PEP 338 में विस्तृत है और इस तथ्य का लाभ उठाता है कि वर्तमान कार्यशील निर्देशिका को sys.path
मॉड्यूल की निर्देशिका के बजाय जोड़ा गया है । यह उपयोग मामला pip install -e .
विकसित / संपादन मोड में एक पैकेज को स्थापित करने के लिए उपयोग करने के समान है।
कमियों
-m
वर्षों से किए गए सभी संवर्द्धन के साथ इसमें अभी भी एक बड़ी कमी है - यह केवल अजगर (यानी, * .py) में लिखे कोड मॉड्यूल को निष्पादित कर सकता है। उदाहरण के लिए, यदि -m
C C संकलित कोड मॉड्यूल निष्पादित करने के लिए उपयोग किया जाता है तो निम्न त्रुटि उत्पन्न होगी, No code object available for <modulename>
( अधिक विवरण के लिए यहां देखें)।
विस्तृत तुलना
अजगर आदेश के माध्यम से मॉड्यूल निष्पादन के प्रभाव (यानी, python <filename>
):
sys.path
में अंतिम निर्देशिका को शामिल करने के लिए संशोधित किया गया है <filename>
__name__
इस पर लगा है '__main__'
__package__
इस पर लगा है None
__init__.py
किसी भी पैकेज के लिए मूल्यांकन नहीं किया जाता है (पैकेज मॉड्यूल के लिए स्वयं सहित)
__main__.py
पैकेज मॉड्यूल के लिए मूल्यांकन किया जाता है; कोड का मूल्यांकन कोड मॉड्यूल के लिए किया जाता है।
आयात विवरण (यानी, import <modulename>
) के माध्यम से मॉड्यूल निष्पादन के प्रभाव :
sys.path
है नहीं किसी भी तरह से संशोधित
__name__
के निरपेक्ष रूप पर सेट है <modulename>
__package__
में तत्काल मूल पैकेज पर सेट किया गया है <modulename>
__init__.py
सभी पैकेजों के लिए मूल्यांकन किया जाता है (पैकेज मॉड्यूल के लिए स्वयं सहित)
__main__.py
पैकेज मॉड्यूल के लिए मूल्यांकन नहीं किया जाता है ; कोड का मूल्यांकन कोड मॉड्यूल के लिए किया जाता है
-M ध्वज के माध्यम से मॉड्यूल निष्पादन के प्रभाव (यानी, python -m <modulename>
):
sys.path
वर्तमान निर्देशिका को शामिल करने के लिए संशोधित किया गया है
__name__
इस पर लगा है '__main__'
__package__
में तत्काल मूल पैकेज पर सेट किया गया है <modulename>
__init__.py
सभी पैकेजों के लिए मूल्यांकन किया जाता है (पैकेज मॉड्यूल के लिए स्वयं सहित)
__main__.py
पैकेज मॉड्यूल के लिए मूल्यांकन किया जाता है; कोड का मूल्यांकन कोड मॉड्यूल के लिए किया जाता है
निष्कर्ष
यह -m
ध्वज अपने सरलतम तरीके से, फिल्नाम के बजाय मॉडुलेनाम का उपयोग करके कमांड लाइन से अजगर लिपियों को निष्पादित करने का साधन है। इसके अतिरिक्त, -m
अतिरिक्त कार्यक्षमता प्रदान करता है जो कि पाइथन कमांड लाइन की सुविधा के साथ import
बयानों की शक्ति (जैसे, स्पष्ट सापेक्ष आयात और स्वत: पैकेज __init__
मूल्यांकन के लिए समर्थन) को जोड़ती है ।
-m
लिए खोज करना लगता हैmymod1
। उदाहरण:python -m SimpleHTTPServer
काम करता है, जबकिpython SimpleHTTPServer
साथ विफल रहता हैcan't open file 'SimpleHTTPServer': [Errno 2] No such file or directory
।