आप उन्हें subprocess
मॉड्यूल के माध्यम से भी कॉल कर सकते हैं , लेकिन ...
पायथन 2.7 और नए के लिए, बस का उपयोग करें
subprocess.check_call(['open', filename])
पायथन 3.5+ में आप थोड़े अधिक जटिल, लेकिन कुछ हद तक बहुमुखी का उपयोग कर सकते हैं
subprocess.run(['open', filename], check=True)
यदि आपको Python 2.4 पर वापस आने के लिए सभी तरह के अनुकूल होने की आवश्यकता है, तो आप subprocess.call()
अपनी स्वयं की त्रुटि जाँच का उपयोग और कार्यान्वित कर सकते हैं :
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
अब, उपयोग करने के क्या फायदे हैं subprocess
?
- सुरक्षा: सिद्धांत रूप में, यह अधिक सुरक्षित है, लेकिन वास्तव में हमें कमांड लाइन को एक या दूसरे तरीके से निष्पादित करने की आवश्यकता है; या तो पर्यावरण में, हमें पर्यावरण और सेवाओं की व्याख्या करने, पथ प्राप्त करने और आगे की आवश्यकता है। न तो मामले में हम मनमाने ढंग से पाठ निष्पादित कर रहे हैं, इसलिए इसमें अंतर्निहित नहीं है "लेकिन आप
'filename ; rm -rf /'
" समस्या टाइप कर सकते हैं , और यदि फ़ाइल का नाम दूषित हो सकता है, तो इसका उपयोग करने subprocess.call
से हमें थोड़ी अतिरिक्त सुरक्षा मिलती है।
- त्रुटि से निपटने: यह वास्तव में हमें कोई और त्रुटि का पता नहीं देता है, हम अभी भी
retcode
किसी भी मामले में निर्भर हैं ; लेकिन एक त्रुटि के मामले में स्पष्ट रूप से एक अपवाद को बढ़ाने का व्यवहार निश्चित रूप से आपको नोटिस करने में मदद करेगा कि क्या कोई विफलता है (हालांकि कुछ परिदृश्यों में, एक ट्रेसबैक बस त्रुटि को अनदेखा करने की तुलना में अधिक उपयोगी नहीं हो सकता है)।
- एक (गैर-अवरोधक) उपप्रकार पैदा करता है : हमें बच्चे की प्रक्रिया के लिए प्रतीक्षा करने की आवश्यकता नहीं है, क्योंकि हम समस्या बयान द्वारा एक अलग प्रक्रिया शुरू कर रहे हैं।
आपत्ति के लिए "लेकिन subprocess
पसंद किया जाता है।" हालांकि, os.system()
पदावनत नहीं किया गया है, और यह कुछ अर्थों में इस विशेष कार्य के लिए सबसे सरल उपकरण है। निष्कर्ष: os.system()
इसलिए उपयोग करना भी एक सही उत्तर है।
एक चिह्नित नुकसान यह है कि विंडोज start
कमांड को आपको पास करने की आवश्यकता होती है shell=True
जिसमें उपयोग करने के अधिकांश लाभों को नकार दिया जाता है subprocess
।