python - पाइप के साथ पायथन subprocess कमांड




linux pipe (5)

JKALAVIS समाधान अच्छा है, हालांकि मैं SHELL = TRUE के बजाय शेलेक्स का उपयोग करने के लिए एक सुधार जोड़ूंगा। नीचे प्रश्नोत्तरी बाहर grepping im

#!/bin/python
import subprocess
import shlex

cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

चीयर्स,

मैं ps -A | grep 'process_name' साथ subprocess.check_output() का उपयोग करना चाहता हूं ps -A | grep 'process_name' । मैंने विभिन्न समाधानों की कोशिश की लेकिन अब तक कुछ भी काम नहीं किया। क्या कोई मुझे मार्गदर्शन कर सकता है कि यह कैसे करें?


Subprocess का उपयोग करके पाइपलाइन सेट अप करने के लिए प्रलेखन देखें: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

मैंने निम्नलिखित कोड उदाहरण का परीक्षण नहीं किया है, लेकिन यह वही होना चाहिए जो आप चाहते हैं:

query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close()  # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]

तुम कोशिश कर सकते हो

check_output(["sh", "-c", "ps", "-A", "|", "grep", "process_name"])

या

check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])

या आप हमेशा subprocess वस्तुओं पर संवाद विधि का उपयोग कर सकते हैं।

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

संचार आउटपुट मानक आउटपुट और मानक त्रुटि को टुपल में लौटाता है।


subprocess मॉड्यूल के साथ एक पाइप का उपयोग करने के लिए, आपको shell=True पास करना होगा।

हालांकि, यह वास्तव में विभिन्न कारणों से सलाह नहीं दी जाती है, जिनमें से कम से कम सुरक्षा नहीं है। इसके बजाए, ps और grep प्रक्रियाओं को अलग से बनाएं, और आउटपुट को एक से दूसरे में पाइप करें, जैसे:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

हालांकि, आपके विशेष मामले में, सरल समाधान subprocess.check_output(('ps', '-A')) को कॉल करना है और फिर str.find पर str.find





pipe