आदेश 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उसी व्यवहार को प्राप्त करने के लिए आप संभावित रूप से कुछ ऐसा कर सकते हैं जो आप करने के लिए नहीं थे।
इंजेक्शन सुरक्षा ( शेल इंजेक्शन उदाहरण देखें ) :
यदि आप एक नए कमांड के रूप में उपयोगकर्ता से इनपुट का उपयोग करते हैं तो आपने मूल रूप से उसे एक शेल दिया है। यह बहुत कुछ SQL इंजेक्शन है जो उपयोगकर्ता के लिए DB में एक शेल प्रदान करता है।
एक उदाहरण के रूप में एक आदेश होगा:
# ... read some user input
os.system(user_input + " some continutation")
इनपुट का उपयोग करके किसी भी मनमाने कोड को चलाने के लिए इसका आसानी से फायदा उठाया जा सकता है : NASTY COMMAND;#आखिरकार:
os.system("NASTY COMMAND; # some continuation")
कई ऐसे कमांड हैं जो आपके सिस्टम को खतरे में डाल सकते हैं।