সেখানে পাইথন এর আরো-নির্দিষ্ট পদ্ধতি ব্যবহার করা উচিত জন্য চার শক্তিশালী মামলা হয় os
ব্যবহার উপর মডিউল os.system
বা subprocess
মডিউল যখন কমান্ড নির্বাহ:
- অপ্রয়োজনীয় - অন্য প্রক্রিয়া তৈরি করা অতিরিক্ত কাজ এবং সময় এবং সংস্থান নষ্ট করে।
- বহনযোগ্যতা -
os
মডিউলটির অনেকগুলি পদ্ধতি একাধিক প্ল্যাটফর্মে পাওয়া যায় যখন অনেকগুলি শেল কমান্ড ওএস-নির্দিষ্ট।
- ফলাফল বুঝুন - আপনি আউটপুট থেকে ফলাফল বিশ্লেষণ এবং বুঝতে নির্বিচারে কমান্ড বাহিনী চালানো একটি প্রক্রিয়া ডিম ছাড়ার যদি এবং কেন কমান্ড কিছু ভুল করেছেন।
- সুরক্ষা - কোনও প্রক্রিয়া তার প্রদত্ত যে কোনও কমান্ড সম্ভাব্যভাবে কার্যকর করতে পারে। এটি একটি দুর্বল নকশা এবং এটি
os
মডিউলটিতে নির্দিষ্ট পদ্ধতি ব্যবহার করে এড়ানো যায় ।
আপনি প্রকৃতপক্ষে সিস্টেম কলগুলিতে যাওয়ার পথে একটি রিডানড্যান্ট "মিডল ম্যান" বাস্তবায়ন করছেন ( chmod
উদাহরণ হিসাবে)। এই মাঝারি মানুষটি একটি নতুন প্রক্রিয়া বা উপ-শেল।
থেকে os.system
:
সাব-শেল-এ কমান্ড (একটি স্ট্রিং) চালিত করুন ...
এবং subprocess
নতুন প্রক্রিয়া স্প্যান করার জন্য একটি মডিউল মাত্র।
এই প্রক্রিয়াগুলি ব্যতীত আপনি যা প্রয়োজন তা করতে পারেন।
os
মডিউল উদ্দেশ্য জেনেরিক অপারেটিং সিস্টেম সেবা প্রদান করা হয় এবং এটি বর্ণনা শুরু সঙ্গে:
এই মডিউলটি অপারেটিং সিস্টেম নির্ভর কার্যকারিতা ব্যবহারের বহনযোগ্য উপায় সরবরাহ করে।
আপনি os.listdir
উভয় উইন্ডো এবং ইউনিক্সে ব্যবহার করতে পারেন । এই কার্যকারিতাটির জন্য os.system
/ ব্যবহার করার চেষ্টা আপনাকে subprocess
দুটি কল বজায় রাখতে বাধ্য করবে (এর জন্য ls
/ dir
) এবং আপনি কোন অপারেটিং সিস্টেমের উপর আছেন তা যাচাই করে নিন। এটি তেমন পোর্টেবল নয় এবং পরে আরও হতাশার কারণ ঘটবে ( হ্যান্ডলিং আউটপুট দেখুন )।
কমান্ডের ফলাফলগুলি বোঝা:
মনে করুন আপনি ফাইলগুলিকে একটি ডিরেক্টরিতে তালিকাবদ্ধ করতে চান।
আপনি যদি os.system("ls")
/subprocess.call(['ls'])
কেবলমাত্র প্রক্রিয়াটির আউটপুট ফিরে পেতে পারেন যা মূলত ফাইলের নামের সাথে একটি বড় স্ট্রিং।
দুটি ফাইল থেকে তার নামের জায়গার কোনও ফাইলকে আপনি কীভাবে বলতে পারেন?
আপনার যদি ফাইলগুলি তালিকাভুক্ত করার অনুমতি নেই?
পাইথন অবজেক্টগুলিতে আপনার কীভাবে ডেটা ম্যাপ করা উচিত?
এগুলি কেবল আমার মাথার উপরের অংশে রয়েছে এবং যখন এই সমস্যার সমাধান রয়েছে - কেন আপনার সমস্যার সমাধান করা সমস্যা আবার কেন সমাধান করবেন?
এটি ইতিমধ্যে বিদ্যমান এবং আপনার জন্য নিখরচায় উপলব্ধ এমন কোনও বাস্তবায়ন পুনরাবৃত্তি না করে নিজেকে পুনরাবৃত্তি না করে নীতির (প্রায়শই "DRY" হিসাবে প্রকাশিত হয়) অনুসরণ করার একটি উদাহরণ ।
সুরক্ষা:
os.system
এবং subprocess
শক্তিশালী হয়। আপনার যখন এই শক্তি প্রয়োজন তখন এটি ভাল তবে যখন আপনি এটি করবেন না তখন এটি বিপজ্জনক। আপনি যখন ব্যবহার করেন os.listdir
, আপনি জানেন যে এটি অন্য কোনও কিছু করতে পারে না তবে ফাইলগুলি তালিকাবদ্ধ করতে বা ত্রুটি বাড়িয়ে তুলতে পারে। আপনি যখন ব্যবহার করেন os.system
বা subprocess
একই আচরণ অর্জন করতে পারেন তখন আপনি সম্ভবত এমন কিছু করে শেষ করতে পারেন যা আপনি করতে চাননি।
ইনজেকশন সুরক্ষা ( শেল ইঞ্জেকশন উদাহরণ দেখুন ) :
আপনি যদি নতুন কমান্ড হিসাবে ব্যবহারকারীর কাছ থেকে ইনপুট ব্যবহার করেন তবে আপনি তাকে মূলত একটি শেল দিয়েছেন। এটি অনেকটা এসকিউএল ইনজেকশনটি ব্যবহারকারীর জন্য ডিবিতে একটি শেল সরবরাহ করে।
উদাহরণটি হ'ল ফর্মটির একটি আদেশ হবে:
# ... read some user input
os.system(user_input + " some continutation")
ইনপুটটি ব্যবহার করে যেকোন যথেচ্ছ কোড চালাতে সহজেই এটি ব্যবহার করা যেতে পারে: ইভেন্টটি NASTY COMMAND;#
তৈরি করতে:
os.system("NASTY COMMAND; # some continuation")
এমন অনেক কমান্ড রয়েছে যা আপনার সিস্টেমকে ঝুঁকিতে ফেলতে পারে।