__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
(পজিক্স / বাশ শেলের মধ্যে, আপনি প্রতিটি বিড়াল কমান্ডের শেষে, ফাইল-এর শেষে অক্ষর + লিখে প্রবেশ << 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
__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জিপ ফাইলে পাইথন কল করা হলে ফাইলটি চালানো হয়।
আপনার তৈরি করা __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/cদির আমদানির সুযোগ থেকে কার্যকর করা হবে cএবং মুখ্য স্ক্রিপ্টের মতো কোনও আমদানি import b.dব্যর্থ হবে।
python -m program_dirএবংpython program_dirকিছুটা আলাদা: পরেরটি কখনও__init__.pyডিরেক্টরিতে চালায় না (যদি থাকে তবে)।