क्या है __main__.py, के लिए फ़ाइल कोड की तरह क्या मैं इसे में डाल दिया जाना चाहिए, और जब मैं एक होना चाहिए?
क्या है __main__.py, के लिए फ़ाइल कोड की तरह क्या मैं इसे में डाल दिया जाना चाहिए, और जब मैं एक होना चाहिए?
जवाबों:
अक्सर, पायथन प्रोग्राम को कमांड लाइन पर .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फ़ाइल की तलाश में होना चाहिए ।
python3 program_dirऔर यह चला __init__.py।
python3 dirचलता है, __main__.pyलेकिन नहीं __init__.py, जबकि python3 -m dirदोनों चलाता है।
__main__.pyजिसके आयात का आयात किया गया है__init__.py
__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
__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 फाइल कहा जाता है तो फाइल चलती है।
आप इसे निष्पादन योग्य बनाने __main__.pyके yourpackageलिए बनाते हैं:
$ python -m yourpackage
-mकाम करता है अगर केवल कार्यक्रम एक मॉड्यूल के रूप में सुलभ है, तो आप python <yourpackage>नोट का उपयोग कर सकते हैं : -mविकल्प के बिना
package?
python -m <yourproject>काम नहीं करता है, -mएक निरर्थक विकल्प है, लेकिन python <yourpackage>अच्छी तरह से काम करता है।
aऔर स्क्रिप्ट मान रहा है a/b/c/__main__.py... python -m b.cनिर्देशिका से निष्पादित होगा aऔर मुख्य स्क्रिप्ट के आयात के सापेक्ष होगा a। लेकिन python b/cdir के आयात दायरे से निष्पादित होगा cऔर इसलिए मुख्य स्क्रिप्ट की तरह कोई भी आयात import b.dविफल हो जाएगा।
python -m program_dirऔरpython program_dirथोड़ा अलग: उत्तरार्द्ध कभी__init__.pyनिर्देशिका में नहीं चलता (यदि एक है)।