2012-02-22 18 views
18

मैं एक मामले अजगर में निम्नलिखित शेल कमांड निष्पादित और उत्पादन प्राप्त करना चाहते हैं के लिए है,पायथन - पाइप के साथ खोल कमांड कैसे निष्पादित करें?

echo This_is_a_testing | grep -c test 

मैं अजगर में ऊपर शेल कमांड निष्पादित करने के लिए, इस अजगर कोड का इस्तेमाल कर सकते

>>> import subprocess 
>>> subprocess.check_output("echo This_is_a_testing | grep -c test", shell=True) 
'1\n' 

लेकिन, जैसा कि मैं "खोल = सच" विकल्प का उपयोग नहीं करना चाहते हैं, मैं निम्नलिखित अजगर कोड,

>>> import subprocess 
>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE) 
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout) 
>>> p1.stdout.close() 
>>> p2.communicate() 
(None, None) 

की कोशिश की मुझे आश्चर्य है कि क्यों आउटपुट के रूप में "कोई नहीं" है मैंने वेबपृष्ठ में विवरणों का उल्लेख किया है: http://docs.python.org/library/subprocess.html#subprocess.PIPE

क्या मुझे अपने कोड में कुछ बिंदु याद आए? कोई सुझाव/विचार? अग्रिम में धन्यवाद।

+0

जवाब – avasal

+0

संबंधित अद्यतन: [मैं subprocess.Popen का उपयोग कैसे करूँ पाइप द्वारा कई प्रक्रियाओं कनेक्ट करने के लिए?] (http://stackoverflow.com/q/295459/4279) – jfs

उत्तर

23

मैनुअल से:

परिणाम टपल में कोई नहीं के अलावा और कुछ पाने के लिए, आप stdout = पाइप और/या stderr = पाइप देने की आवश्यकता

p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout, stdout=subprocess.PIPE) 
25

की जांच करें यहां:

>>> import subprocess 
>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE) 
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout) 
>>> 1 
p1.stdout.close() 
>>> p2.communicate() 
(None, None) 
>>> 

यहां आपकोलिखने के बाद उत्पादन के रूप में 1 मिलता है, इस प्रश्न को अपने प्रश्न के संदर्भ में अनदेखा न करें।

यदि यह तुम क्या चाहते है, तो तर्क के रूप में stdout=subprocess.PIPE पारित दूसरा Popen रहे हैं:

>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE) 
>>> p2 = subprocess.Popen(["grep", "test"], stdin=p1.stdout, stdout=subprocess.PIPE) 
>>> p2.communicate() 
('This_is_a_testing\n', None) 
>>> 
+0

अब मैं जानता हूँ कि 'p2.communicate()' के लिए काम करने के लिए, मुझे कोड 'p2 = ...' में 'stdout = subprocess.PIPE' जोड़ना होगा। धन्यवाद। – user1129812

+0

यदि पी 1 परिणाम में होता है तो मुझे त्रुटि कैसे मिल सकती है? मेरा सवाल यह है कि क्या आप इसके साथ मदद कर सकते हैं? http://stackoverflow.com/questions/40467105/how-to-catch-ping-error-with-python –

8
>>> import subprocess 

>>> mycmd=subprocess.getoutput('df -h | grep home | gawk \'{ print $1 }\' | cut -d\'/\' -f3') 

>>> mycmd 

'sda6' 

>>> 
+0

यह आंतरिक रूप से खोल का उपयोग करता है। ओपी ने स्पष्ट रूप से कहा: * "मैं" खोल = सही "विकल्प का उपयोग नहीं करना चाहता" * – jfs

+1

धन्यवाद। पाइथन में "*** पाइप के साथ खोल कमांड कैसे निष्पादित करें" की खोज करते समय मैं वही खोज रहा हूं। – xpt

+2

मुझे – Anake

1

स्वीकार किए जाते हैं जवाब सही/काम कर रहे, एक और विकल्प के लिए Popen.communicate() विधि का उपयोग किया जाएगा है, वहीं एक प्रक्रिया में कुछ पास करें 'stdin:

>>> import subprocess 
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
>>> p2.communicate("This_is_a_testing") 
('1\n', None) 
>>> print p2.returncode 
0 
>>>> 

यह किसी अन्य कमांड को निष्पादित करने के लिए इसे पुनर्निर्देशित करने की आवश्यकता को हल करता है अगर, आउटपुट पहले ही पाइथन लिपि में ही जाना जाता है।

हालांकि communicate का दुष्प्रभाव है, यह प्रक्रिया को समाप्त करने की प्रतीक्षा करता है। यदि दो प्रक्रियाओं का उपयोग करके एसिंक्रोनस निष्पादन की आवश्यकता होती है/वांछित विकल्प बेहतर विकल्प हो सकता है।

-1

मैंने sh -c "echo 1| grep 1" की कोशिश की और सफलता प्राप्त की। इस तरह: result=subprocess.Popen(['sh','-c',"\"\"echo 1|grep 1\"\""], stdout=subprocess.PIPE).communicate()[0]

संबंधित मुद्दे