यहाँ अन्य उत्तर पर्याप्त रूप से सुरक्षा केविशेषों की व्याख्या करते हैं जो subprocess
प्रलेखन में भी वर्णित हैं । लेकिन इसके अलावा, आप जिस प्रोग्राम को चलाना चाहते हैं, उसे शुरू करने के लिए एक शेल शुरू करने का ओवरहेड अक्सर अनावश्यक होता है और निश्चित रूप से उन स्थितियों के लिए मूर्खतापूर्ण होता है जहां आप वास्तव में शेल की कार्यक्षमता का उपयोग नहीं करते हैं। इसके अलावा, अतिरिक्त छिपी हुई जटिलता आपको डराना चाहिए, विशेष रूप से यदि आप शेल या इसके द्वारा प्रदान की जाने वाली सेवाओं से बहुत परिचित नहीं हैं।
जहां शेल के साथ बातचीत nontrivial होती है, आपको अब पायथन और शेल स्क्रिप्ट दोनों को समझने के लिए पाइथन लिपि के पाठक और अनुचर (जो आपका भविष्य का स्वयं का हो सकता है या नहीं भी हो सकता है) की आवश्यकता होती है। याद रखें कि पायथन आदर्श वाक्य "स्पष्ट रूप से निहित से बेहतर है";यहां तक कि जब पायथन कोड समतुल्य (और अक्सर बहुत अधिक) शेल स्क्रिप्ट की तुलना में कुछ अधिक जटिल होने जा रहा है, तो आप शेल को हटाने और देशी पायथन निर्माणों के साथ कार्यक्षमता की जगह लेने से बेहतर हो सकते हैं। बाहरी प्रक्रिया में किए गए काम को कम से कम करना और जहां तक संभव हो अपने कोड के भीतर नियंत्रण रखना अक्सर एक अच्छा विचार है, क्योंकि यह दृश्यता में सुधार करता है और - वांछित या अवांछित - साइड इफेक्ट्स के जोखिम को कम करता है।
वाइल्डकार्ड विस्तार, चर प्रक्षेप, और पुनर्निर्देशन सभी को मूल पायथन निर्माणों के साथ बदलने के लिए सरल है। एक जटिल शेल पाइप लाइन जहां पाइथन में पुर्जे या सभी को यथोचित रूप से दोबारा नहीं लिखा जा सकता है, वह एक ऐसी स्थिति होगी जहां आप शेल का उपयोग करने पर विचार कर सकते हैं। आपको अभी भी यह सुनिश्चित करना चाहिए कि आप प्रदर्शन और सुरक्षा निहितार्थ को समझते हैं।
तुच्छ मामले में, बचने के लिए shell=True
, बस प्रतिस्थापित करें
subprocess.Popen("command -with -options 'like this' and\\ an\\ argument", shell=True)
साथ में
subprocess.Popen(['command', '-with','-options', 'like this', 'and an argument'])
ध्यान दें कि पहला तर्क कैसे पास करने के लिए स्ट्रिंग्स की एक सूची है execvp()
, और स्ट्रिंग्स और बैकस्लैश-एस्केप शेल मेटाचैकर्स को कैसे उद्धृत किया जाए , यह आमतौर पर आवश्यक नहीं है (या उपयोगी, या सही)। शायद यह भी देखें कि शेल चर के आसपास कब कोट लपेटें?
एक तरफ के रूप में, आप बहुत बार बचना चाहते हैं Popen
यदि subprocess
पैकेज में एक सरल रैपर आप क्या चाहते हैं। यदि आपके पास हाल ही में पर्याप्त अजगर है, तो आपको संभवतः उपयोग करना चाहिए subprocess.run
।
- इसके साथ
check=True
यदि आप विफल हुआ तो कमांड विफल हो जाएगा।
- इसके साथ
stdout=subprocess.PIPE
कमांड का आउटपुट कैप्चर करेगा।
- थोड़ा अस्पष्ट रूप से,
universal_newlines=True
यह एक उचित यूनिकोड स्ट्रिंग में आउटपुट को डीकोड करेगा (यह सिर्फ bytes
सिस्टम एन्कोडिंग में है, अन्यथा पायथन 3 पर)।
यदि नहीं, तो कई कार्यों के लिए, आप check_output
एक कमांड से आउटपुट प्राप्त करना चाहते हैं , जबकि यह जांचना कि यह सफल हुआ है, या check_call
अगर कोई आउटपुट इकट्ठा नहीं करना है।
मैं डेविड कॉर्न के एक उद्धरण के साथ बंद करूँगा: "पोर्टेबल शेल स्क्रिप्ट की तुलना में पोर्टेबल शेल लिखना आसान है।" यहां तक कि subprocess.run('echo "$HOME"', shell=True)
विंडोज के लिए पोर्टेबल नहीं है।
-l
करने के लिए पारित हो जाता है/bin/sh
के बजाय (शेल)ls
कार्यक्रम यूनिक्स अगर परshell=True
। स्ट्रिंग तर्क कोshell=True
सूची के बजाय अधिकांश मामलों में उपयोग किया जाना चाहिए ।