-M विकल्प या नहीं के साथ पायथन कोड का निष्पादन
-m
झंडे का इस्तेमाल करें ।
जब आपके पास स्क्रिप्ट होती है, तो परिणाम बहुत अधिक होते हैं, लेकिन जब आप -m
झंडे के बिना एक पैकेज विकसित करते हैं , तो आयात करने के लिए सही तरीके से काम करने का कोई तरीका नहीं है यदि आप मुख्य प्रविष्टि के रूप में पैकेज में एक सबपैकेज या मॉड्यूल चलाना चाहते हैं अपने कार्यक्रम को इंगित करें (और मुझ पर विश्वास करें, मैंने कोशिश की है।)
डॉक्स
जैसे डॉल्स-एम ध्वज पर कहते हैं:
नामित मॉड्यूल के लिए sys.path खोजें और मॉड्यूल के रूप में इसकी सामग्री को निष्पादित करें __main__
।
तथा
-C विकल्प के रूप में, वर्तमान निर्देशिका को sys.path की शुरुआत में जोड़ा जाएगा।
इसलिए
python -m pdb
के बराबर है
python /usr/lib/python3.5/pdb.py
(मान लें कि आपके पास अपनी वर्तमान निर्देशिका में कोई पैकेज या स्क्रिप्ट नहीं है जिसे pdb.py कहा जाता है)
स्पष्टीकरण:
व्यवहार "लिपियों के समान" जानबूझकर किया जाता है।
कई मानक लाइब्रेरी मॉड्यूल में कोड होते हैं जो स्क्रिप्ट के रूप में उनके निष्पादन पर लगाए जाते हैं। एक उदाहरण टाइमिट मॉड्यूल है:
कुछ अजगर कोड को एक मॉड्यूल के रूप में चलाने का इरादा है : (मुझे लगता है कि यह उदाहरण कमांडलाइन विकल्प doc उदाहरण से बेहतर है)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
और पायथन 2.4 के रिलीज़ नोट पर प्रकाश डाला गया :
एम-कमांड लाइन विकल्प - पायथन-एम मोडुलनेम मानक पुस्तकालय में एक मॉड्यूल मिलेगा, और इसे लागू करेगा। उदाहरण के लिए, python -m pdb
के बराबर हैpython /usr/lib/python2.4/pdb.py
अनुवर्ती सवाल
इसके अलावा, डेविड बेज़ले के पाइथन आवश्यक संदर्भ इसे "एम-विकल्प एक स्क्रिप्ट के रूप में एक लाइब्रेरी मॉड्यूल चलाता है जो __main__
मुख्य स्क्रिप्ट के निष्पादन से पहले मॉड्यूल के अंदर निष्पादित करता है" के रूप में बताता है ।
इसका मतलब है कि कोई भी मॉड्यूल जिसे आप आयात विवरण के साथ देख सकते हैं, उसे कार्यक्रम के प्रवेश बिंदु के रूप में चलाया जा सकता है - यदि इसमें एक कोड ब्लॉक है, आमतौर पर अंत के पास, साथ if __name__ == '__main__':
।
-m
वर्तमान निर्देशिका को पथ में जोड़े बिना:
अन्यत्र यहाँ एक टिप्पणी कहती है:
वह -m विकल्प वर्तमान निर्देशिका को sys.path में भी जोड़ता है, स्पष्ट रूप से एक सुरक्षा समस्या है (देखें: प्रीलोड हमला)। यह व्यवहार विंडोज में लाइब्रेरी सर्च ऑर्डर के समान है (इससे पहले हाल ही में इसे सख्त किया गया था)। यह अफ़सोस की बात है कि पायथन प्रवृत्ति का पालन नहीं करता है और जोड़ने को अक्षम करने का एक सरल तरीका प्रदान नहीं करता है। to sys.path
खैर, यह संभावित मुद्दे को प्रदर्शित करता है - (विंडोज़ में उद्धरण हटाएं):
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
-I
उत्पादन वातावरण के लिए इसे बंद करने के लिए ध्वज का उपयोग करें (संस्करण 3.4 में नया):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
से डॉक्स :
-I
पायथन को पृथक मोड में चलाएं। इसका तात्पर्य -E और -s भी है। पृथक मोड में sys.path में न तो स्क्रिप्ट की निर्देशिका होती है और न ही उपयोगकर्ता की साइट-संकुल निर्देशिका होती है। सभी PYTHON * पर्यावरण चर को भी नजरअंदाज कर दिया जाता है। उपयोगकर्ता को दुर्भावनापूर्ण कोड इंजेक्ट करने से रोकने के लिए आगे प्रतिबंध लगाए जा सकते हैं।
क्या करता __package__
है?
यह स्पष्ट रूप से सापेक्ष आयात को सक्षम करता है, विशेष रूप से इस सवाल को नहीं, हालांकि - इस उत्तर को यहां देखें: पायथन में "__package__" विशेषता का उद्देश्य क्या है?
PYTHONPATH=test python -m foo.bar
मतलब है? क्या आप इसे विस्तार से बता सकते हैं, कृपया