পাইথন কোডটি এম-এর বিকল্পের সাথে কার্যকর করা যায় না
-m
পতাকা ব্যবহার করুন ।
ফলাফলগুলি যখন আপনার কোনও স্ক্রিপ্ট থাকে তখন একই রকম হয়, তবে -m
পতাকা ছাড়াই আপনি যখন কোনও প্যাকেজ বিকাশ করেন, তখন আপনি প্রধান প্রবেশ হিসাবে প্যাকেজটিতে সাব-প্যাকেজ বা মডিউল চালাতে চাইলে আমদানিগুলি সঠিকভাবে কাজ করার কোনও উপায় নেই আপনার প্রোগ্রামের দিকে নির্দেশ করুন (এবং বিশ্বাস করুন, আমি চেষ্টা করেছি।)
ডকস
-ম পতাকাটিতে থাকা দস্তাবেজের মতো বলুন:
নামযুক্ত মডিউলটির জন্য sys.path অনুসন্ধান করুন এবং মডিউল হিসাবে এর বিষয়বস্তুগুলি কার্যকর করুন __main__
।
এবং
-C বিকল্পের মতো, বর্তমান ডিরেক্টরিটি sys.path শুরুতে যুক্ত করা হবে।
সুতরাং
python -m pdb
মোটামুটি সমান
python /usr/lib/python3.5/pdb.py
(ধরে নিলাম আপনার বর্তমান ডিরেক্টরিতে পিডিবি.পি নামে একটি প্যাকেজ বা স্ক্রিপ্ট নেই)
ব্যাখ্যা:
আচরণটি "ইচ্ছাকৃতভাবে" স্ক্রিপ্টগুলির অনুরূপ করা হয়।
অনেক স্ট্যান্ডার্ড লাইব্রেরি মডিউলগুলিতে কোড থাকে যা তাদের স্ক্রিপ্ট হিসাবে কার্যকর করার জন্য অনুরোধ করা হয়। একটি উদাহরণ হ'ল সময়কালীন মডিউল:
কিছু অজগর কোড মডিউল হিসাবে চালানোর উদ্দেশ্যে করা হয়েছে : (আমি মনে করি এই উদাহরণটি কমান্ডলাইন বিকল্প ডক উদাহরণের চেয়ে ভাল)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
পাইথন ২.৪-এর জন্য প্রকাশিত নোটের হাইলাইটগুলি থেকে :
-M কমান্ড লাইন বিকল্পটি - পাইথন-এম মডিউল নাম স্ট্যান্ডার্ড লাইব্রেরিতে একটি মডিউল খুঁজে পেতে পারে এবং এটিতে অনুরোধ জানায়। উদাহরণস্বরূপ, python -m pdb
সমানpython /usr/lib/python2.4/pdb.py
ফলো-আপ প্রশ্ন
এছাড়াও, ডেভিড বেজলির পাইথন এসেনশিয়াল রেফারেন্সটি এটিকে ব্যাখ্যা করেছে কারণ "The -m অপশনটি একটি স্ক্রিপ্ট হিসাবে একটি লাইব্রেরি মডিউল চালায় যা __main__
মূল স্ক্রিপ্টটি কার্যকর করার আগে মডিউলের ভিতরে সঞ্চালিত হয় "।
এর মানে কোন মডিউল আপনাকে একটি আমদানি বক্তব্যের সঙ্গে অনুসন্ধান করতে পারেন প্রোগ্রামের এন্ট্রি পয়েন্ট হিসাবে চালানো যাবে - যদি এটা একটি কোড ব্লক হয়েছে সাধারণত শেষ কাছাকাছি, সঙ্গে if __name__ == '__main__':
।
-m
পথে বর্তমান ডিরেক্টরিটি যুক্ত না করে:
এখানে অন্যত্র একটি মন্তব্য বলেছেন:
যে -m বিকল্পটি বর্তমান ডিরেক্টরিটিকে sys.path এ যুক্ত করে, এটি অবশ্যই একটি সুরক্ষা সমস্যা (দেখুন: প্রিলোড আক্রমণ) attack এই আচরণটি উইন্ডোজে লাইব্রেরি অনুসন্ধানের ক্রমের অনুরূপ (এটি সম্প্রতি কঠোর করার আগে)। এটি অত্যন্ত দুঃখের বিষয় যে পাইথন ট্রেন্ডটি অনুসরণ করে না এবং যোগ করা অক্ষম করার সহজ উপায় সরবরাহ করে না। to sys.path
ঠিক আছে, এটি সম্ভাব্য সমস্যাটি দেখায় - (উইন্ডোতে উদ্ধৃতিগুলি সরান):
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
-I
উত্পাদন পরিবেশের জন্য এটি লক করতে পতাকাটি ব্যবহার করুন (সংস্করণ 3.4 এ নতুন):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
ডক্স থেকে :
-I
পাইথনকে বিচ্ছিন্ন মোডে চালান। এটি ই-এবং-এসকেও বোঝায়। বিচ্ছিন্ন মোডে sys.path- এ স্ক্রিপ্টের ডিরেক্টরি বা ব্যবহারকারীর সাইট-প্যাকেজ ডিরেক্টরি নেই। সমস্ত পাইথন * এনভায়রনমেন্ট ভেরিয়েবলগুলিও উপেক্ষা করা হয়। ব্যবহারকারীকে দূষিত কোড ইনজেকশন প্রতিরোধ করতে আরও বিধিনিষেধ আরোপ করা যেতে পারে।
কি করে __package__
?
এটি এই প্রশ্নের বিশেষত জার্মানি নয়, সুস্পষ্ট আপেক্ষিক আমদানি সক্ষম করে - যদিও এই উত্তরটি এখানে দেখুন: পাইথনের "__package__" বৈশিষ্ট্যের উদ্দেশ্য কী?
PYTHONPATH=test python -m foo.bar
বলতে আসলে কী বোঝায়? দয়া করে আপনি এটি বিশদভাবে ব্যাখ্যা করতে পারেন?