কম্পিউটার টিউটোরিয়াল

পাইথনে টপ-লেভেল স্ক্রিপ্ট এনভায়রনমেন্ট (__main__)

একটি মডিউল অবজেক্ট বিভিন্ন অ্যাট্রিবিউট দ্বারা চরিত্রিত হয়। অ্যাট্রিবিউটের নাম ডবল আন্ডারস্কোর __ দ্বারা প্রিফিক্স এবং পোস্টফিক্স করা হয়। মডিউলের সবচেয়ে গুরুত্বপূর্ণ অ্যাট্রিবিউট হলো __name__। যখন পাইথন টপ-লেভেল এক্সিকিউটেবল কোড হিসেবে চলছে, অর্থাৎ যখন স্ট্যান্ডার্ড ইনপুট থেকে পড়া হচ্ছে, একটি স্ক্রিপ্ট, বা একটি ইন্টারেক্টিভ প্রম্পট থেকে, তখন __name__ অ্যাট্রিবিউট '__main__' সেট করা হয়।

>>> __name__
'__main__'

একটি স্ক্রিপ্টের ভিতর থেকেও, আমরা দেখি __name__ অ্যাট্রিবিউটের মান '__main__' সেট করা থাকে। নিচের স্ক্রিপ্ট এক্সিকিউট করুন।

'module docstring'
print('name of module:', __name__)

আউটপুট

name of module: __main__

তবে, একটি ইম্পোর্ট করা মডিউলের জন্য এই অ্যাট্রিবিউট পাইথন স্ক্রিপ্টের নাম সেট করা হয়। hello.py মডিউলের জন্য:

>>> import hello
>>> hello.__name__
hello

দেখা গেল, টপ-লেভেল মডিউলের জন্য __name__-এর মান __main__ সেট করা থাকে। তবে, ইম্পোর্ট করা মডিউলের জন্য এটি একটি ফাইলের নাম সেট করা হয়। নিচের স্ক্রিপ্ট (moduletest.py) চালান:

import hello
print('name of top level module:', __name__)
print('name of imported module:', hello.__name__)

আউটপুট

name of top level module: __main__
name of imported module: hello

একটি পাইথন স্ক্রিপ্ট যেটিতে ফাংশন থাকে, সেটিতে কিছু এক্সিকিউটেবল কোডও থাকতে পারে। অতএব যদি আমরা এটি ইম্পোর্ট করি, এর কোড অটোমেটিক্যালি চলবে। আমাদের messages.py নামে একটি স্ক্রিপ্ট আছে দুটি ফাংশনসহ। এক্সিকিউটেবল অংশে ইউজার ইনপুট thanks() ফাংশনের আর্গুমেন্ট হিসেবে প্রদান করা হয়।

def welcome(name):
    print("Hi {}. Welcome to TutorialsPoint".format(name))
    return
def thanks(name):
    print("Thank you {}. See you again".format(name))
name = input('enter name:')
thanks(name)

স্পষ্টতযখন messages.py রান করি, আউটপুটে একটি থ্যাংকস মেসেজ দেখায়।

enter name:Ajit
Thank you Ajit. See you again

আমাদের moduletest.py নামে একটি স্ক্রিপ্ট আছে নিচের মত:

import messages
print('name of top level module:', __name__)
print('name of imported module:', messages.__name__)

এখন যদি moduletest.py স্ক্রিপ্টটি রান করি, আমরা দেখব ইনপুট স্টেটমেন্ট এবং welcome() কল এক্সিকিউট হচ্ছে।

c:\python37>python moduletest.py

আউটপুট

enter name:Kishan
Thank you Kishan. See you again
enter name:milind
Hi milind. Welcome to TutorialsPoint

এটি উভয় স্ক্রিপ্টের আউটপুট। কিন্তু আমরা messages মডিউল থেকে ফাংশন ইম্পোর্ট চাই কিন্তু সেটির এক্সিকিউটেবল কোড নয়।

এখানেই টপ-লেভেল স্ক্রিপ্টের __name__ অ্যাট্রিবিউটের মান __main__ হওয়ার ফ্যাক্ট কাজে আসে। messages.py স্ক্রিপ্ট পরিবর্তন করুন যাতে এটি ইনপুট এবং ফাংশন কল স্টেটমেন্ট এক্সিকিউট করে শুধু যখন __name__ __main__-এর সমান।

"docstring of messages module"
def welcome(name):
    print("Hi {}. Welcome to TutorialsPoint".format(name))
    return
def thanks(name):
    print("Thank you {}. See you again".format(name))
if __name__ == '__main__':
    name = input('enter name')
    thanks(name)

যখন আপনি একটি মডিউল চান যা এক্সিকিউট এবং ইম্পোর্ট দুভাবেই করা যায়, এই টেকনিক ব্যবহার করুন। moduletest.py-তে কোনো পরিবর্তন দরকার নেই। messages মডিউলের এক্সিকিউটেবল অংশ এখন রান হবে না।

enter name: milind
Hi milind. Welcome to TutorialsPoint

নোট করুন এটি আপনাকে messages.py স্ক্রিপ্ট স্বতন্ত্রভাবে রান করার বাধা দেয় না।

  1. পাইথন ভার্চুয়াল এনভায়রনমেন্ট (Virtual Environment)

  2. পাইথন লাইব্রেরি বাইট-কম্পাইল করা

  3. পাইথনে টপ-লেভেল স্ক্রিপ্ট এনভায়রনমেন্ট (__main__)

  4. পাইথন getpass মডিউল