इस प्रश्न का उत्तर आपके द्वारा उपयोग किए जा रहे पायथन के संस्करण पर निर्भर करता है। 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
निष्पादित करने के लिए बराबर है और , और केवल विशेषता को वापस करना ।run
check=True
stdout=PIPE
stdout
आप पास कर सकते हैं 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 में एक वस्तु। यह यूनिकोड के बारे में जानने के लिए एक क्षण लेने के लायक है यदि आपने पहले ही नहीं किया है।