__Main__.py क्या है?


326

क्या है __main__.py, के लिए फ़ाइल कोड की तरह क्या मैं इसे में डाल दिया जाना चाहिए, और जब मैं एक होना चाहिए?

जवाबों:


319

अक्सर, पायथन प्रोग्राम को कमांड लाइन पर .py फ़ाइल नाम देकर चलाया जाता है:

$ python my_program.py

आप एक निर्देशिका या ज़िप कोड से भरा कोड भी बना सकते हैं और इसमें शामिल कर सकते हैं __main__.py। तब आप बस कमांड लाइन पर डायरेक्टरी या जिपफाइल का नाम रख सकते हैं, और यह __main__.pyस्वचालित रूप से निष्पादित होता है:

$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program

आपको खुद तय करना होगा कि क्या इस तरह से क्रियान्वित होने से आपका आवेदन लाभान्वित हो सकता है।


ध्यान दें कि एक __main__ मॉड्यूल आमतौर पर एक __main__.pyफ़ाइल से नहीं आता है । यह कर सकते हैं, लेकिन यह आमतौर पर नहीं है। जब आप जैसे स्क्रिप्ट चलाते हैं python my_program.py, तो स्क्रिप्ट __main__मॉड्यूल के बजाय मॉड्यूल के रूप में चलेगी my_program। यह मॉड्यूल के रूप में python -m my_module, या कई अन्य तरीकों से भी चलता है।

यदि आपने __main__एक त्रुटि संदेश में नाम देखा है , तो इसका मतलब यह नहीं है कि आपको एक __main__.pyफ़ाइल की तलाश में होना चाहिए ।


22
मैंने पाया python -m program_dirऔर python program_dirथोड़ा अलग: उत्तरार्द्ध कभी __init__.pyनिर्देशिका में नहीं चलता (यदि एक है)।
ब्रक

5
@brk: अब ऐसा प्रतीत नहीं होता। मैंने बस कोशिश की python3 program_dirऔर यह चला __init__.py
mk12

@ mk12 मैंने अभी-अभी यह कोशिश की है कि मैं @ brk के निष्कर्षों की पुष्टि कर सकता हूँ: python3 dirचलता है, __main__.pyलेकिन नहीं __init__.py, जबकि python3 -m dirदोनों चलाता है।
मार्सेल्लो रोमानी

1
@ mk12 संभवत: आपके पास कुछ कोड था __main__.pyजिसके आयात का आयात किया गया है__init__.py
wim

100

__main__.pyफ़ाइल किस लिए है?

पायथन मॉड्यूल बनाते समय, मॉड्यूल mainको प्रोग्राम की प्रविष्टि बिंदु के रूप में चलाने पर कुछ कार्यक्षमता (आमतौर पर फ़ंक्शन में निहित ) को निष्पादित करना सामान्य है । यह आमतौर पर पायथन फ़ाइलों के निचले हिस्से में रखे गए सामान्य मुहावरे के साथ किया जाता है:

if __name__ == '__main__':
    # execute only if run as the entry point into the program
    main()

आप पायथन पैकेज के लिए समान शब्दार्थ प्राप्त कर सकते हैं __main__.py। यह एक लिनक्स शेल प्रॉम्प्ट है, $यदि आपके पास विंडोज पर बैश (या कोई अन्य पॉज़िक्स शेल) नहीं है, तो बस इन फ़ाइलों demo/__<init/main>__.pyको EOFएस के बीच की सामग्री के साथ बनाएँ :

$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
    print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF

(एक Posix / बैश शेल में, आप प्रत्येक बिल्ली कमांड के अंत में, + के-फ़ाइल चरित्र के अंत में प्रवेश करके , बिना << EOFs और समाप्ति EOFs के बिना ऊपर कर सकते हैं )CtrlD

और अब:

$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed

आप इसे दस्तावेज़ से प्राप्त कर सकते हैं। प्रलेखन कहते हैं:

__main__ - शीर्ष-स्तरीय स्क्रिप्ट वातावरण

'__main__'उस स्कोप का नाम है जिसमें शीर्ष-स्तरीय कोड निष्पादित होता है। जब मानक इनपुट, स्क्रिप्ट, या एक इंटरैक्टिव प्रॉम्प्ट से पढ़ा __name__जाता है '__main__'तो एक मॉड्यूल सेट होता है ।

एक मॉड्यूल यह पता लगा सकता है कि यह मुख्य दायरे में चल रहा है या नहीं __name__, इसकी स्वयं जाँच करके , जो किसी सामान्य मुहावरे को किसी मॉड्यूल में कोड निष्पादित करने के लिए अनुमति देता है, जब इसे स्क्रिप्ट के साथ चलाया जाता है या python -mआयात नहीं होने पर:

if __name__ == '__main__':
      # execute only if run as a script
      main()

एक पैकेज के लिए, एक ही प्रभाव एक __main__.pyमॉड्यूल को शामिल करके प्राप्त किया जा सकता है , जिसकी सामग्री को मॉड्यूल के साथ चलाने पर निष्पादित किया जाएगा -m

ज़िपित

आप इसे एक एकल फ़ाइल में भी पैकेज कर सकते हैं और इसे कमांड लाइन से इस तरह से चला सकते हैं - लेकिन ध्यान दें कि ज़िप किए गए पैकेज प्रविष्टि बिंदु के रूप में उप-पैकेज या सबमॉड्यूल निष्पादित नहीं कर सकते हैं:

$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed

31

__main__.pyज़िप फ़ाइलों में अजगर कार्यक्रमों के लिए प्रयोग किया जाता है। __main__.pyजब ज़िप फ़ाइल में चलाने फ़ाइल निष्पादित किया जाएगा। उदाहरण के लिए, यदि ज़िप फ़ाइल इस प्रकार थी:

test.zip
     __main__.py

और की सामग्री __main__.pyथी

import sys
print "hello %s" % sys.argv[1]

फिर अगर हम दौड़ते python test.zip worldतो हमें मिल जाताhello world बाहर।

तो __main__.pyजब pipthon को zip फाइल कहा जाता है तो फाइल चलती है।


23

आप इसे निष्पादन योग्य बनाने __main__.pyके yourpackageलिए बनाते हैं:

$ python -m yourpackage

1
-mकाम करता है अगर केवल कार्यक्रम एक मॉड्यूल के रूप में सुलभ है, तो आप python <yourpackage>नोट का उपयोग कर सकते हैं : -mविकल्प के बिना
बिन्यामीन जाफरी

1
@BenyaminJafari कमांड लाइन पायथन प्रोग्राम लिखना संभव नहीं है जो एक मॉड्यूल के रूप में सुलभ नहीं है । शायद आपका मतलब है package?
अनातोली टेकटोनिक

1
जब हम एक पायथन पैकेज बनाते हैं जिसमें मुख्य .py होता है, तो इसे चलाने के लिए यह python -m <yourproject>काम नहीं करता है, -mएक निरर्थक विकल्प है, लेकिन python <yourpackage>अच्छी तरह से काम करता है।
बेनामिन जाफरी

@BenyaminJafari -m झंडा कुछ मामलों में फर्क करता है। निर्देशिका से निष्पादित aऔर स्क्रिप्ट मान रहा है a/b/c/__main__.py... python -m b.cनिर्देशिका से निष्पादित होगा aऔर मुख्य स्क्रिप्ट के आयात के सापेक्ष होगा a। लेकिन python b/cdir के आयात दायरे से निष्पादित होगा cऔर इसलिए मुख्य स्क्रिप्ट की तरह कोई भी आयात import b.dविफल हो जाएगा।
माइकपीटीटी

14

यदि आपकी स्क्रिप्ट एक एकल अजगर फ़ाइल के बजाय एक निर्देशिका या ज़िप फ़ाइल है, __main__.pyतो "स्क्रिप्ट" अजगर अजगर दुभाषिया के तर्क के रूप में पारित होने पर निष्पादित किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.