-ম সুইচটির উদ্দেশ্য কী?


174

আপনি কল করতে পার্থক্য কি আমাকে ব্যাখ্যা করতে পারেন

python -m mymod1 mymod2.py args

এবং

python mymod1.py mymod2.py args

এটি উভয় ক্ষেত্রেই mymod1.pyবলা হয় এবং sys.argvহয়

['mymod1.py', 'mymod2.py', 'args']

সুতরাং কি জন্য -mস্যুইচ?


আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন তবে এটি ডিফল্ট লাইব্রেরির পথে -mসন্ধান করছে বলে মনে হচ্ছে mymod1। উদাহরণ: python -m SimpleHTTPServerকাজ করে, যেখানে python SimpleHTTPServerব্যর্থ হয় can't open file 'SimpleHTTPServer': [Errno 2] No such file or directory
বাস্জ

7
: আমি আসলে উত্তর এখানে পরিষ্কার পাওয়া stackoverflow.com/questions/46319694/...
Casebash

উত্তর:


137

পিইপি 338Rationale বিভাগের প্রথম লাইনটি বলে:

পাইথন ২.৪ স্ক্রিপ্ট হিসাবে সম্পাদনের জন্য পাইথন মডিউল নামস্থান ব্যবহার করে মডিউলগুলি অবস্থিত করতে মঞ্জুরির জন্য কমান্ড লাইন সুইচ-এম যোগ করে। প্রেরণাদায়ী উদাহরণগুলি ছিল পিডিবি এবং প্রোফাইলের মতো স্ট্যান্ডার্ড লাইব্রেরি মডিউল এবং এই সীমিত উদ্দেশ্যে পাইথন ২.৪ বাস্তবায়ন ঠিক আছে for

সুতরাং আপনি পাইথনের অনুসন্ধানের পথে কোনও মডিউলকে বর্তমান ডিরেক্টরিতে কেবল ফাইলগুলিই নির্দিষ্ট করতে পারেন। আপনি python mymod1.py mymod2.py argsঠিক যে একই প্রভাব আছে। Scope of this proposalবিভাগের প্রথম লাইনে বলা হয়েছে:

পাইথন ২.৪-তে, -m ব্যবহার করে একটি মডিউল ঠিক একইভাবে কার্যকর করা হয় যেমন ফাইলের নাম কমান্ড লাইনে সরবরাহ করা হয়েছিল।

সঙ্গে -mআরও মডিউল যা প্যাকেজ-এর অংশ, ইত্যাদি PEP 338 বাকি সম্পর্কে কী যে সঙ্গে কাজ করতে চান সম্ভব,। আরও তথ্যের জন্য এটি পড়ুন।


47
আমার প্রিয় ব্যবহারের -mহয় python -m SimpleHTTPServer। যখন ইউএসবি ফ্ল্যাশ ড্রাইভ ব্যবহার না করে কিছু ফাইল ভাগ করে নেওয়া দরকার তখন সত্যিই সহজ।
এআরবিউন

21
@ আরিফডন রানিং পাইথন 3 এর জন্য সামান্য আপডেটের প্রয়োজন রয়েছে python -m http.serverএবং এটি এখনও দুর্দান্ত!
কিট রোড

12
টিএল; ডিআর: 1) আপনি চালাতে পারেন 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। আপনি উত্তরে এটি পরিষ্কার করার পরামর্শ দিন।
স্মি

19

প্যাকেজের কোনও ফাইল থাকলে এটি কেবল এটি কাজ করে তা__main__.py উল্লেখযোগ্য , অন্যথায়, এই প্যাকেজটি সরাসরি সম্পাদন করা যায় না।

python -m some_package some_arguments

পাইথন ইন্টারপ্রেটার __main__.pyকার্যকর করতে প্যাকেজ পথে কোনও ফাইল সন্ধান করবে। এটি এর সমতুল্য:

python path_to_package/__main__.py somearguments

এটি এর পরে সামগ্রীটি কার্যকর করবে:

if __name__ == "__main__":

2
প্যাকেজ init ফাইল সম্পর্কে কি? মূল ফাইলটির উপস্থিতিতে, ডিআইআই কি এছাড়াও আহ্বান করা হবে?
পরিবর্তনশীল

@variable হ্যাঁ init আগে .py প্রার্থনা করা হবে প্রধান .py প্রার্থনা করা হয়
মার্ক Rucker

1

এই প্রশ্নটি সত্ত্বেও বেশ কয়েকবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে (যেমন, এখানে , এখানে , এখানে , এবং এখানে ) আমার মতে কোনও বিদ্যমান উত্তর পুরো বা সংক্ষিপ্তভাবে -mপতাকাটির সমস্ত নিদর্শনগুলি ধারণ করে না । অতএব, নিম্নলিখিতগুলি যা আগে এসেছে তার উন্নতি করার চেষ্টা করবে।

ভূমিকা (টিএলডিআর)

-mকমান্ড তাদের নয় জিনিস অনেক অগত্যা সব সময় প্রয়োজন হবে না। সংক্ষেপে এটি: (1) পাইথন স্ক্রিপ্টগুলি ফাইল নামের পরিবর্তে মডিউলনেমের মাধ্যমে সম্পাদন করার অনুমতি দেয় (2) রেজোলিউশনের sys.pathজন্য যুক্ত করার জন্য একটি ডিরেক্টরি বেছে নিতে দেয় importএবং (3) কমান্ড লাইন থেকে আপেক্ষিক আমদানির সাথে পাইথন স্ক্রিপ্টগুলি কার্যকর করতে দেয় ।

preliminaries

-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কার্যকর করা হবে।

এর Developmentতিহাসিক বিকাশ -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

ব্যবহারের ক্ষেত্রে

এম-ফ্ল্যাগের জন্য দুটি উল্লেখযোগ্য ব্যবহারের কেস রয়েছে:

  1. কমান্ড লাইন থেকে মডিউলগুলি সম্পাদন করা যার জন্য তাদের ফাইলের নামটি না জানা থাকতে পারে। এই ব্যবহারের ক্ষেত্রে পাইথন ইন্টারপ্রেটার কীভাবে মডিউল নামগুলিকে ফাইলের নামগুলিতে রূপান্তর করতে হয় তা জেনে থাকে of এটি বিশেষত সুবিধাজনক যখন কেউ কমান্ড লাইন থেকে stdlib মডিউল বা তৃতীয় পক্ষের মডিউল চালাতে চায়। উদাহরণস্বরূপ, খুব কম লোকই http.serverমডিউলটির ফাইল নাম জানেন তবে বেশিরভাগ লোকেরা এটির মডিউল নাম জানেন তাই আমরা কমান্ড লাইনটি ব্যবহার করে এটি ব্যবহার করতে পারি python -m http.server

  2. কোনও স্থানীয় প্যাকেজ ইনস্টল করার প্রয়োজন ছাড়াই নিরঙ্কুশ আমদানি যুক্ত কার্যকর করতে। এই ব্যবহারের ক্ষেত্রে পিইপি 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
পরিবর্তনশীল

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