इस प्रश्न का उत्तर आपके द्वारा उपयोग किए जा रहे पायथन के संस्करण पर निर्भर करता है। subprocess.check_outputफ़ंक्शन का उपयोग करने के लिए सबसे सरल तरीका है :
>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
check_outputएकल प्रोग्राम चलाता है जो केवल तर्कों को इनपुट के रूप में लेता है। 1 यह परिणाम उसी तरह देता है जैसे कि मुद्रित किया जाता है stdout। यदि आपको इनपुट लिखने की आवश्यकता है stdin, तो आगे runया Popenवर्गों को छोड़ें । यदि आप जटिल शेल कमांड निष्पादित करना चाहते हैं, तो shell=Trueइस उत्तर के अंत में नोट देखें ।
check_outputसमारोह अभी भी व्यापक उपयोग (2.7+) में अजगर के लगभग सभी संस्करणों पर काम करता है। 2 लेकिन अधिक हाल के संस्करणों के लिए, यह अब अनुशंसित दृष्टिकोण नहीं है।
पायथन के आधुनिक संस्करण (3.5 या अधिक): run
यदि आप पायथन 3.5 या उच्चतर का उपयोग कर रहे हैं , और पीछे की संगतता की आवश्यकता नहीं है , तो नए runफ़ंक्शन की सिफारिश की जाती है। यह subprocessमॉड्यूल के लिए एक बहुत ही सामान्य, उच्च-स्तरीय एपीआई प्रदान करता है। किसी प्रोग्राम के आउटपुट को कैप्चर करने के लिए, subprocess.PIPEफ्लैग को stdoutकीवर्ड तर्क में पास करें। फिर stdoutलौटे CompletedProcessऑब्जेक्ट की विशेषता तक पहुँचें:
>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
वापसी मूल्य एक bytesवस्तु है, इसलिए यदि आप एक उचित स्ट्रिंग चाहते हैं, तो आपको इसकी आवश्यकता होगी decode। यूटीएफ -8-एन्कोडेड स्ट्रिंग नामक प्रक्रिया को वापस लेता है:
>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
यह सब एक-लाइनर के लिए संकुचित किया जा सकता है:
>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
यदि आप प्रक्रिया के लिए इनपुट पास करना चाहते हैं stdin, bytesतो inputकीवर्ड तर्क के लिए एक ऑब्जेक्ट पास करें :
>>> cmd = ['awk', 'length($0) > 5']
>>> input = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)
>>> result.stdout.decode('utf-8')
'foofoo\n'
आप stderr=subprocess.PIPE(कैप्चर टू result.stderr) या stderr=subprocess.STDOUT( result.stdoutनियमित आउटपुट के साथ कैप्चर ) करके त्रुटियों को पकड़ सकते हैं । जब सुरक्षा चिंता का विषय नहीं है, तो आप shell=Trueनीचे दिए गए नोट्स में वर्णित करके अधिक जटिल शेल कमांड भी चला सकते हैं।
यह चीजों को करने के पुराने तरीके की तुलना में, बस थोड़ी जटिलता जोड़ता है। लेकिन मुझे लगता है कि यह भुगतान के लायक है: अब आप लगभग कुछ भी कर सकते हैं जो आपको runअकेले कार्य करने की आवश्यकता है ।
पायथन के पुराने संस्करण (2.7-3.4): check_output
यदि आप पायथन के पुराने संस्करण का उपयोग कर रहे हैं, या मामूली पीछे की संगतता की आवश्यकता है, तो आप संभवतः check_outputऊपर वर्णित संक्षेप में फ़ंक्शन का उपयोग कर सकते हैं। यह पायथन 2.7 के बाद से उपलब्ध है।
subprocess.check_output(*popenargs, **kwargs)
यह उसी तर्क को लेता है जैसे Popen(नीचे देखें), और प्रोग्राम के आउटपुट में एक स्ट्रिंग देता है। इस उत्तर की शुरुआत का अधिक विस्तृत उपयोग उदाहरण है। पायथन 3.5 और उससे अधिक में, के साथ check_outputनिष्पादित करने के लिए बराबर है और , और केवल विशेषता को वापस करना ।runcheck=Truestdout=PIPEstdout
आप पास कर सकते हैं stderr=subprocess.STDOUTकि त्रुटि संदेश लौटे उत्पादन में शामिल हैं सुनिश्चित करने के लिए - लेकिन अजगर गुजर के कुछ संस्करणों में stderr=subprocess.PIPEकरने के लिए check_outputकर सकते हैं कारण गतिरोध । जब सुरक्षा चिंता का विषय नहीं है, तो आप shell=Trueनीचे दिए गए नोट्स में वर्णित करके अधिक जटिल शेल कमांड भी चला सकते हैं।
यदि आपको stderrप्रक्रिया से इनपुट या पास करने की आवश्यकता है, check_outputतो कार्य तक नहीं होगा। Popenउस मामले में नीचे दिए गए उदाहरण देखें ।
पायथन के जटिल अनुप्रयोग और विरासत संस्करण (2.6 और नीचे): Popen
यदि आपको गहरी बैकवर्ड संगतता की आवश्यकता है, या यदि आपको check_outputप्रदान की तुलना में अधिक परिष्कृत कार्यक्षमता की आवश्यकता है , तो आपको सीधे Popenऑब्जेक्ट्स के साथ काम करना होगा , जो कि सबप्रोसेस के लिए निम्न-स्तरीय एपीआई को एन्क्रिप्ट करता है।
Popenनिर्माता या तो स्वीकार करता है एक भी आदेश तर्क के बिना, या एक सूची अपनी पहली आइटम के रूप में एक कमांड, तर्क के किसी भी संख्या, सूची में एक अलग आइटम के रूप में प्रत्येक के बाद से युक्त। shlex.splitउचित रूप से स्वरूपित सूचियों में पार्स स्ट्रिंग्स की मदद कर सकते हैं। Popenऑब्जेक्ट भी प्रक्रिया IO प्रबंधन और निम्न-स्तरीय कॉन्फ़िगरेशन के लिए विभिन्न तर्कों के एक मेजबान को स्वीकार करते हैं ।
इनपुट और कैप्चर आउटपुट भेजने के लिए, communicateलगभग हमेशा पसंदीदा तरीका है। जैसे की:
output = subprocess.Popen(["mycmd", "myarg"],
stdout=subprocess.PIPE).communicate()[0]
या
>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo
यदि आप सेट करते हैं stdin=PIPE, तो आप communicateडेटा को प्रक्रिया से गुजरने की अनुमति भी देते हैं stdin:
>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
... stderr=subprocess.PIPE,
... stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo
नोट हारून हॉल के जवाब है, जो कि इंगित करता है कुछ सिस्टम पर, आप सेट करना पड़ सकता है stdout, stderrऔर stdinसभी के लिए PIPE(या DEVNULL) प्राप्त करने के लिए communicateकाम करने के लिए सभी पर।
कुछ दुर्लभ मामलों में, आपको जटिल, वास्तविक समय आउटपुट कैप्चरिंग की आवश्यकता हो सकती है। वार्टेक का उत्तर आगे बढ़ने का एक तरीका बताता है, लेकिन communicateअगर ध्यान से इस्तेमाल न किया जाए तो इसके अलावा अन्य तरीके गतिरोध की आशंका रखते हैं।
उपरोक्त सभी कार्यों के साथ, जब सुरक्षा चिंता का विषय नहीं है, तो आप पास करके अधिक जटिल शेल कमांड चला सकते हैं shell=True।
टिप्पणियाँ
1. रनिंग शेल कमांड: shell=Trueतर्क
सामान्य रूप से, प्रत्येक कॉल टू run, check_outputया Popenकंस्ट्रक्टर एकल प्रोग्राम को निष्पादित करता है । इसका मतलब है कि कोई फैंसी बैश स्टाइल पाइप नहीं है। यदि आप जटिल शेल कमांड चलाना चाहते हैं, तो आप पास कर सकते हैं shell=True, जो तीनों कार्यों का समर्थन करता है।
हालाँकि, ऐसा करना सुरक्षा चिंताओं को बढ़ाता है । यदि आप लाइट स्क्रिप्टिंग से अधिक कुछ भी कर रहे हैं, तो आप प्रत्येक प्रक्रिया को अलग से कॉल करने से बेहतर हो सकते हैं, और प्रत्येक से आउटपुट को अगले इनपुट के रूप में पास कर सकते हैं, के माध्यम से
run(cmd, [stdout=etc...], input=other_output)
या
Popen(cmd, [stdout=etc...]).communicate(other_output)
पाइपों को सीधे कनेक्ट करने का प्रलोभन मजबूत है; इसका प्रतिरोध करें। अन्यथा, आपको संभवत: गतिरोध दिखाई देगा या इस तरह की हैकिंग चीजें करनी होंगी ।
2. यूनिकोड विचार
check_outputपाइथन 2 में एक स्ट्रिंग देता है, लेकिन bytesपाइथन 3 में एक वस्तु। यह यूनिकोड के बारे में जानने के लिए एक क्षण लेने के लायक है यदि आपने पहले ही नहीं किया है।