आदेश 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")
कई ऐसे कमांड हैं जो आपके सिस्टम को खतरे में डाल सकते हैं।