关于python:如何使用带有管道的`subprocess`命令

How to use `subprocess` command with pipes

我想用subprocess.check_output()ps -A | grep 'process_name'。我试过各种各样的解决办法,但到目前为止都没用。有人能指导我怎么做吗?


要将管道与subprocess模块一起使用,必须通过shell=True

然而,由于各种原因,这并不是真正的明智之举,尤其是安全性。相反,分别创建psgrep进程,并将输出从一个进程传输到另一个进程,如下所示:

1
2
3
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


或者,您可以始终在子流程对象上使用Communicate方法。

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

communication方法返回标准输出和标准错误的元组。


请参阅有关使用子流程设置管道的文档:http://docs.python.org/2/library/subprocess.html替换shell管道

我没有测试以下代码示例,但它应该大致符合您的要求:

1
2
3
4
5
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。下面我将列出查询时间

1
2
3
4
5
6
7
8
#!/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

干杯,


另外,尝试使用'pgrep'命令而不是'ps -A | grep 'process_name'命令。


您可以在sh.py中尝试管道功能:

1
2
import sh
print sh.grep(sh.ps("-ax"),"process_name")