__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
ও সমাপ্তি ছাড়াই উপরেরটি করতে পারেন )EOF
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
জিপ ফাইলে পাইথন কল করা হলে ফাইলটি চালানো হয়।
আপনার তৈরি করা __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
ডিরেক্টরিতে চালায় না (যদি থাকে তবে)।