__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ডিরেক্টরিতে চালায় না (যদি থাকে তবে)।
brk

5
@ বিআরকে: এখনকার মতো হবে বলে মনে হচ্ছে না। আমি চেষ্টা করেছি python3 program_dirএবং এটি দৌড়ে __init__.py
এম কে 12

@ এম কে 12 আমি কেবল এটি চেষ্টা করেছি আমি @ ব্র্যাকের ফলাফলগুলি নিশ্চিত করতে পারি: 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

(পজিক্স / বাশ শেলের মধ্যে, আপনি প্রতিটি বিড়াল কমান্ডের শেষে, ফাইল-এর শেষে অক্ষর + লিখে প্রবেশ << EOFও সমাপ্তি ছাড়াই উপরেরটি করতে পারেন )EOFCtrlD

এবং এখন:

$ 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জিপ ফাইলে পাইথন কল করা হলে ফাইলটি চালানো হয়।


23

আপনার তৈরি করা __main__.pyমধ্যে yourpackageএটি হিসাবে এক্সিকিউটেবল করতে:

$ python -m yourpackage

1
-mযদি প্রোগ্রামটি মডিউল হিসাবে অ্যাক্সেসযোগ্য হয় তবেই কাজ করে, অন্যথায় আপনি python <yourpackage>দ্রষ্টব্য ব্যবহার করতে পারেন : -mবিকল্প ছাড়াই
বেনিয়ামিন জাফারি

1
@ বেন্যামিন জাফারি কমান্ড লাইন পাইথন প্রোগ্রাম লিখতে পারবেন না যা মডিউল হিসাবে অ্যাক্সেসযোগ্য নয় । আপনি বোঝাতে চেয়েছেন package?
অ্যানাটোলি টেকটোনিক

1
যখন আমরা পাইথন প্যাকেজ তৈরি করি যার মধ্যে মূল থাকে .py চালানো কার্যকর python -m <yourproject>নয়, -mএটি একটি অপ্রয়োজনীয় বিকল্প, তবে python <yourpackage>ভালভাবে কাজ করে।
বেনিয়ামিন জাফারি

@ বেনিয়ামিনজাফারি-এম পতাকা কিছু ক্ষেত্রে একটি পার্থক্য করে। ডিরেক্টরি থেকে চালানো aএবং স্ক্রিপ্ট ধরে a/b/c/__main__.py... python -m b.cডিরেক্টরি থেকে কার্যকর করা হবেa এবং মূল স্ক্রিপ্টের আমদানিগুলি সম্পর্কিত হবে a। তবে python b/cদির আমদানির সুযোগ থেকে কার্যকর করা হবে cএবং মুখ্য স্ক্রিপ্টের মতো কোনও আমদানি import b.dব্যর্থ হবে।
মাইকেসিপিটি

14

যদি আপনার স্ক্রিপ্টটি একক পাইথন ফাইলের পরিবর্তে ডিরেক্টরি বা জিপ ফাইল __main__.pyহয় তবে পাইথন ইন্টারপ্রেটারের আর্গুমেন্ট হিসাবে "স্ক্রিপ্ট" পাস করার পরে কার্যকর করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.