আপনি কল করতে পার্থক্য কি আমাকে ব্যাখ্যা করতে পারেন
python -m mymod1 mymod2.py args
এবং
python mymod1.py mymod2.py args
এটি উভয় ক্ষেত্রেই mymod1.py
বলা হয় এবং sys.argv
হয়
['mymod1.py', 'mymod2.py', 'args']
সুতরাং কি জন্য -m
স্যুইচ?
আপনি কল করতে পার্থক্য কি আমাকে ব্যাখ্যা করতে পারেন
python -m mymod1 mymod2.py args
এবং
python mymod1.py mymod2.py args
এটি উভয় ক্ষেত্রেই mymod1.py
বলা হয় এবং sys.argv
হয়
['mymod1.py', 'mymod2.py', 'args']
সুতরাং কি জন্য -m
স্যুইচ?
উত্তর:
পিইপি 338Rationale
বিভাগের প্রথম লাইনটি বলে:
পাইথন ২.৪ স্ক্রিপ্ট হিসাবে সম্পাদনের জন্য পাইথন মডিউল নামস্থান ব্যবহার করে মডিউলগুলি অবস্থিত করতে মঞ্জুরির জন্য কমান্ড লাইন সুইচ-এম যোগ করে। প্রেরণাদায়ী উদাহরণগুলি ছিল পিডিবি এবং প্রোফাইলের মতো স্ট্যান্ডার্ড লাইব্রেরি মডিউল এবং এই সীমিত উদ্দেশ্যে পাইথন ২.৪ বাস্তবায়ন ঠিক আছে for
সুতরাং আপনি পাইথনের অনুসন্ধানের পথে কোনও মডিউলকে বর্তমান ডিরেক্টরিতে কেবল ফাইলগুলিই নির্দিষ্ট করতে পারেন। আপনি python mymod1.py mymod2.py args
ঠিক যে একই প্রভাব আছে। Scope of this proposal
বিভাগের প্রথম লাইনে বলা হয়েছে:
পাইথন ২.৪-তে, -m ব্যবহার করে একটি মডিউল ঠিক একইভাবে কার্যকর করা হয় যেমন ফাইলের নাম কমান্ড লাইনে সরবরাহ করা হয়েছিল।
সঙ্গে -m
আরও মডিউল যা প্যাকেজ-এর অংশ, ইত্যাদি PEP 338 বাকি সম্পর্কে কী যে সঙ্গে কাজ করতে চান সম্ভব,। আরও তথ্যের জন্য এটি পড়ুন।
-m
হয় python -m SimpleHTTPServer
। যখন ইউএসবি ফ্ল্যাশ ড্রাইভ ব্যবহার না করে কিছু ফাইল ভাগ করে নেওয়া দরকার তখন সত্যিই সহজ।
python -m http.server
এবং এটি এখনও দুর্দান্ত!
python -m package.subpackage.module
এবং সাধারণ সমাধানকারী যন্ত্রপাতি ব্যবহার করা হবে, আপনাকে সঠিক .py
ফাইলটি নির্দেশ করতে হবে না । 2) কোনও মেশিন ছাড়াই চালিত মডিউলটি থেকে আপেক্ষিক আমদানি করা সম্ভব, কারণ এর প্যাকেজটি সেই পথে লোড হবে। 3) পরম আমদানির আপনার বর্তমান ডিরেক্টরির না ডিরেক্টরির যেখানে উপর ভিত্তি করে করা হবে .py
ফাইল (হয় ''
প্রধান এ sys.path
বদলে, /path/to/my
যদি স্ক্রিপ্ট এ, /path/to/my/script.py
)।
__main__.py
ফাইল রয়েছে। বেশিরভাগ না এবং ভাঙবে যেমন python -m sys 'print(sys.version)'
ব্যর্থ python: No code object available for sys
। আপনি উত্তরে এটি পরিষ্কার করার পরামর্শ দিন।
প্যাকেজের কোনও ফাইল থাকলে এটি কেবল এটি কাজ করে তা__main__.py
উল্লেখযোগ্য , অন্যথায়, এই প্যাকেজটি সরাসরি সম্পাদন করা যায় না।
python -m some_package some_arguments
পাইথন ইন্টারপ্রেটার __main__.py
কার্যকর করতে প্যাকেজ পথে কোনও ফাইল সন্ধান করবে। এটি এর সমতুল্য:
python path_to_package/__main__.py somearguments
এটি এর পরে সামগ্রীটি কার্যকর করবে:
if __name__ == "__main__":
এই প্রশ্নটি সত্ত্বেও বেশ কয়েকবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে (যেমন, এখানে , এখানে , এখানে , এবং এখানে ) আমার মতে কোনও বিদ্যমান উত্তর পুরো বা সংক্ষিপ্তভাবে -m
পতাকাটির সমস্ত নিদর্শনগুলি ধারণ করে না । অতএব, নিম্নলিখিতগুলি যা আগে এসেছে তার উন্নতি করার চেষ্টা করবে।
-m
কমান্ড তাদের নয় জিনিস অনেক অগত্যা সব সময় প্রয়োজন হবে না। সংক্ষেপে এটি: (1) পাইথন স্ক্রিপ্টগুলি ফাইল নামের পরিবর্তে মডিউলনেমের মাধ্যমে সম্পাদন করার অনুমতি দেয় (2) রেজোলিউশনের sys.path
জন্য যুক্ত করার জন্য একটি ডিরেক্টরি বেছে নিতে দেয় import
এবং (3) কমান্ড লাইন থেকে আপেক্ষিক আমদানির সাথে পাইথন স্ক্রিপ্টগুলি কার্যকর করতে দেয় ।
-m
পতাকাটি ব্যাখ্যা করার জন্য প্রথমে আমাদের অবশ্যই একটি সামান্য পরিভাষা পরিষ্কার করতে হবে।
প্রথমত, পাইথনের প্রাথমিক সাংগঠনিক ইউনিট একটি মডিউল হিসাবে পরিচিত । মডিউল দুটি স্বাদের মধ্যে একটিতে আসে: কোড মডিউল এবং প্যাকেজ মডিউল। একটি কোড মডিউলটি এমন কোনও ফাইল যা পাইথন এক্সিকিউটেবল কোড ধারণ করে। একটি প্যাকেজ মডিউল একটি ডিরেক্টরি যা অন্যান্য মডিউল (কোড মডিউল বা প্যাকেজ মডিউল) ধারণ করে। সর্বাধিক সাধারণ ধরণের কোড মডিউলগুলি *.py
ফাইল হয় যখন সর্বাধিক সাধারণ ধরণের প্যাকেজ মডিউলগুলির মধ্যে একটি __init__.py
ফাইল থাকে directories
দ্বিতীয়ত, সমস্ত মডিউল দুটি স্বতন্ত্র উপায়ে স্বতন্ত্রভাবে চিহ্নিত করা যায়: <modulename>
এবং <filename>
। মডিউলগুলি প্রায়শই পাইথন কোডে মডিউল নাম (যেমন, import <modulename>
) এবং কমান্ড লাইনে ফাইলের নাম দ্বারা চিহ্নিত করা হয় (যেমন, python <filename>
)। সমস্ত পাইথন ইন্টারপ্রেটার ভাল-সংজ্ঞায়িত নিয়মের একটি সেট মাধ্যমে মডিউল নামগুলি ফাইলের নামগুলিতে রূপান্তর করতে পারে। এই নিয়মগুলি sys.path
ভেরিয়েবলের উপর জড়িত এবং সুতরাং মানটি পরিবর্তন করে ম্যাপিংটি পরিবর্তন করা যেতে পারে (আরও কীভাবে এটি করা হয় তার জন্য পিইপি 302 দেখুন )।
তৃতীয়ত, সমস্ত মডিউল (উভয় কোড এবং প্যাকেজ) কার্যকর করা যায় (যার অর্থ আমরা মডিউলটির সাথে যুক্ত কোডটি পাইথন ইন্টারপ্রেটার দ্বারা মূল্যায়ন করা হবে)। এক্সিকিউশন পদ্ধতি এবং মডিউলের ধরণের উপর নির্ভর করে কোন কোডটি মূল্যায়ন হয় এবং কখন, কিছুটা পরিবর্তন করতে পারে। উদাহরণস্বরূপ, যদি কেউ এর মাধ্যমে কোনও প্যাকেজ মডিউল চালায় python <filename>
তবে <filename>/__init__.py
তার পরে মূল্যায়ন করা হবে <filename>/__main__.py
। অন্যদিকে, যদি কেউ একই প্যাকেজ মডিউলটি প্রয়োগ করে import <modulename>
তবে কেবল প্যাকেজগুলি __init__.py
কার্যকর করা হবে।
-m
-ম পতাকাটি প্রথম পাইথন ২.৪.১ এ প্রবর্তিত হয়েছিল । প্রাথমিকভাবে এর একমাত্র উদ্দেশ্য ছিল মৃত্যুদন্ড কার্যকর করার জন্য পাইথন মডিউল সনাক্তকরণের বিকল্প উপায় সরবরাহ করা। এটি হল, যদি আমরা উভয় <filename>
এবং <modulename>
মডিউলটির জন্য জানতাম তবে নিম্নলিখিত দুটি কমান্ড সমান ছিল: python <filename> <args>
এবং python -m <modulename> <args>
। অতিরিক্ত হিসাবে, পিইপি 338 অনুসারে এই পুনরাবৃত্তিটি -m
কেবলমাত্র শীর্ষ স্তরের মডিউল নামগুলির সাথে কাজ করেছে (অর্থাত্ মডিউলগুলি যা কোনও হস্তক্ষেপকারী প্যাকেজ ছাড়াই সিএস.পথে সরাসরি পাওয়া যায়)।
শেষ করে PEP 338-m
কার্যকারিতা সমর্থন বাড়ানো হয়েছে <modulename>
শীর্ষ স্তরের modulenames পরলোক উপস্থাপনা। এর অর্থ হ'ল নামগুলি http.server
এখন পুরোপুরি সমর্থিত। এই বর্ধনের অর্থ হ'ল মডিউলটির সাথে মডিউলের সমস্ত প্যাকেজগুলি এখন লোড হয়ে গেছে (যেমন, সমস্ত প্যাকেজ __init__.py
ফাইলগুলি মূল্যায়ন করা হয়েছিল), নিজেই মডিউলটির সাথে।
চূড়ান্ত প্রধান বৈশিষ্ট্য বর্ধন পিইপি 366-m
সঙ্গে এসেছিল । এই আপডেটের সাহায্যে কেবল নিরঙ্কুশ আমদানি নয় সুস্পষ্ট আপেক্ষিক আমদানিও সমর্থন করার ক্ষমতা অর্জন হয়েছিল। কমান্ডের নামযুক্ত মডিউলটির জন্য ভেরিয়েবল পরিবর্তন করে এটি অর্জন করা হয়েছিল ।-m
__package__
-m
এম-ফ্ল্যাগের জন্য দুটি উল্লেখযোগ্য ব্যবহারের কেস রয়েছে:
কমান্ড লাইন থেকে মডিউলগুলি সম্পাদন করা যার জন্য তাদের ফাইলের নামটি না জানা থাকতে পারে। এই ব্যবহারের ক্ষেত্রে পাইথন ইন্টারপ্রেটার কীভাবে মডিউল নামগুলিকে ফাইলের নামগুলিতে রূপান্তর করতে হয় তা জেনে থাকে of এটি বিশেষত সুবিধাজনক যখন কেউ কমান্ড লাইন থেকে stdlib মডিউল বা তৃতীয় পক্ষের মডিউল চালাতে চায়। উদাহরণস্বরূপ, খুব কম লোকই http.server
মডিউলটির ফাইল নাম জানেন তবে বেশিরভাগ লোকেরা এটির মডিউল নাম জানেন তাই আমরা কমান্ড লাইনটি ব্যবহার করে এটি ব্যবহার করতে পারি python -m http.server
।
কোনও স্থানীয় প্যাকেজ ইনস্টল করার প্রয়োজন ছাড়াই নিরঙ্কুশ আমদানি যুক্ত কার্যকর করতে। এই ব্যবহারের ক্ষেত্রে পিইপি 338-তে বিশদ দেওয়া আছে এবং sys.path
মডিউলটির ডিরেক্টরি পরিবর্তে বর্তমানের কার্যক্ষম ডিরেক্টরিটি যুক্ত করা হয়েছে le এই ব্যবহারের ক্ষেত্রে pip install -e .
বিকাশ / সম্পাদনা মোডে একটি প্যাকেজ ইনস্টল করতে ব্যবহার করার অনুরূপ ।
-m
বছরের পর বছর ধরে করা সমস্ত বর্ধনের সাথে এর এখনও একটি বড় ঘাটতি রয়েছে - এটি কেবলমাত্র পাইথনে লিখিত কোড মডিউলগুলি কার্যকর করতে পারে (যেমন, * .py)। উদাহরণস্বরূপ, যদি -m
একটি সি কম্পাইল কোড মডিউল নিম্নলিখিত ত্রুটির উত্পাদিত হবে চালানো ব্যবহার করা হয়, No code object available for <modulename>
(দেখুন এখানে আরো বিস্তারিত জানার জন্য)।
পাইথন কমান্ডের মাধ্যমে মডিউল কার্যকর করার প্রভাব (যেমন, python <filename>
):
sys.path
চূড়ান্ত ডিরেক্টরি অন্তর্ভুক্ত পরিবর্তন করা হয় <filename>
__name__
প্রস্তুুত '__main__'
__package__
প্রস্তুুত None
__init__.py
কোনও প্যাকেজের জন্য মূল্যায়ন করা হয় না (প্যাকেজ মডিউলগুলির জন্য এটি নিজস্ব সহ)__main__.py
প্যাকেজ মডিউল জন্য মূল্যায়ন করা হয়; কোডটি মডিউলগুলির জন্য মূল্যায়ন করা হয়।আমদানি বিবৃতি (যেমন, import <modulename>
) এর মাধ্যমে মডিউল কার্যকরকরণের প্রভাব :
sys.path
কোনওভাবেই পরিবর্তিত হয় না__name__
এর পরম রূপে সেট করা আছে <modulename>
__package__
মধ্যে তাত্ক্ষণিক প্যারেন্ট প্যাকেজ সেট করা আছে <modulename>
__init__.py
সমস্ত প্যাকেজগুলির জন্য মূল্যায়ন করা হয় (প্যাকেজ মডিউলগুলির জন্য এটি নিজস্ব সহ)__main__.py
প্যাকেজ মডিউলগুলির জন্য মূল্যায়ন করা হয় না ; কোডটি মডিউলগুলির জন্য মূল্যায়ন করা হয়-এম পতাকা (যেমন, python -m <modulename>
) এর মাধ্যমে মডিউল কার্যকরকরণের প্রভাব :
sys.path
বর্তমান ডিরেক্টরি অন্তর্ভুক্ত করার জন্য পরিবর্তন করা হয়েছে__name__
প্রস্তুুত '__main__'
__package__
মধ্যে তাত্ক্ষণিক প্যারেন্ট প্যাকেজ সেট করা আছে <modulename>
__init__.py
সমস্ত প্যাকেজগুলির জন্য মূল্যায়ন করা হয় (প্যাকেজ মডিউলগুলির জন্য এটি নিজস্ব সহ)__main__.py
প্যাকেজ মডিউল জন্য মূল্যায়ন করা হয়; কোডটি মডিউলগুলির জন্য মূল্যায়ন করা হয়-m
পতাকা সরলতম, ফাইলের নাম বদলে modulenames ব্যবহার করে কম্যান্ড লাইন থেকে পাইথন স্ক্রিপ্ট চালানো একটি উপায় এ নেই। অতিরিক্তভাবে, -m
অতিরিক্ত কার্যকারিতা সরবরাহ করে যা import
বিবৃতিগুলির শক্তিকে (যেমন, সুস্পষ্ট আপেক্ষিক আমদানি এবং স্বয়ংক্রিয় প্যাকেজ __init__
মূল্যায়নের জন্য সমর্থন ) পাইথন কমান্ড লাইনের সুবিধার্থে সরবরাহ করে।
python -m packagename
এখানে উল্লিখিত হিসাবে চালিত প্যাকেজ ব্যবহার যুক্ত করতে পারেন : stackoverflow.com/a/53772635/1779091
-m
সন্ধান করছে বলে মনে হচ্ছেmymod1
। উদাহরণ:python -m SimpleHTTPServer
কাজ করে, যেখানেpython SimpleHTTPServer
ব্যর্থ হয়can't open file 'SimpleHTTPServer': [Errno 2] No such file or directory
।