मैं के subprocess.check_output()
साथ उपयोग करना चाहते हैं ps -A | grep 'process_name'
। मैंने विभिन्न समाधानों की कोशिश की लेकिन अभी तक कुछ भी काम नहीं आया। क्या कोई मुझे गाइड कर सकता है कि मैं इसे कैसे करूं?
मैं के subprocess.check_output()
साथ उपयोग करना चाहते हैं ps -A | grep 'process_name'
। मैंने विभिन्न समाधानों की कोशिश की लेकिन अभी तक कुछ भी काम नहीं आया। क्या कोई मुझे गाइड कर सकता है कि मैं इसे कैसे करूं?
जवाबों:
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
आउटपुट पर है।
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
मतलब सिर्फ इतना है कि कुछ भी नहीं मिला, इसलिए यह सामान्य व्यवहार है।
ps.wait()
जब हमारे पास पहले से ही आउटपुट है तो हमें इसकी आवश्यकता क्यों है । ps.wait.__doc__
बच्चे के समाप्त होने की प्रतीक्षा करता है, लेकिन बच्चे की सामग्री पहले से ही output
चर में रखी हुई लगती है
string.find
, जो str.find
(यानी, वस्तुओं find
पर विधि str
) के पक्ष में चित्रित किया गया है ।
grep
समय से पहले मृत्यु हो जाती है; ps
यदि यह अपने OS पाइप बफर को भरने के लिए पर्याप्त उत्पादन का उत्पादन करता है, तो अनिश्चित काल तक लटका रह सकता है (क्योंकि आपको ps.stdout.close()
माता-पिता में नहीं बुलाया गया है)। शुरुआती आदेश को स्वैप करें, इससे बचने के लिए
या आप हमेशा उपप्रोसेस ऑब्जेक्ट पर संचार विधि का उपयोग कर सकते हैं।
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
संचार विधि मानक आउटपुट और मानक त्रुटि का एक टपल देता है।
communicate
करना बेहतर है wait
। इस तरह की चेतावनी है: "stdout = PIPE और / या stderr = PIPE का उपयोग करते समय यह गतिरोध करेगा और बच्चे की प्रक्रिया एक पाइप में पर्याप्त आउटपुट उत्पन्न करती है, जिससे यह अधिक डेटा स्वीकार करने के लिए OS पाइप बफर के इंतजार में ब्लॉक का उपयोग करता है। उससे बचो। "
सबप्रोसेस का उपयोग करके पाइपलाइन स्थापित करने के बारे में दस्तावेज देखें: 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]
JKALAVIS समाधान अच्छा है, हालांकि मैं शेल = ट्रायल के बजाय श्लेक्स का उपयोग करने के लिए एक सुधार जोड़ूंगा। नीचे क्वेरी बाहर grepping बार
#!/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)
आप sh.py में पाइप की कार्यक्षमता आज़मा सकते हैं :
import sh
print sh.grep(sh.ps("-ax"), "process_name")