Answers:
要将管道与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
只是意味着grep找不到任何东西,因此这是正常行为。
ps.wait()
当我们已经有了输出时,为什么需要for。ps.wait.__doc__
等待孩子终止,但是孩子的内容似乎已经放入output
变量中
string.find
,这有利于被弃用str.find
(即方法find
上的str
对象)。
或者,您始终可以在子流程对象上使用communication方法。
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
通信方法返回标准输出和标准错误的元组。
请参阅有关使用子流程设置管道的文档: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解决方案很好,但是我将使用shlex代替SHELL = TRUE进行改进。下面即时查询时间
#!/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)