我想与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
。
或者,你可以随时使用的子对象的沟通方法。
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]
您可以尝试在sh.py管道的功能:
import sh
print sh.grep(sh.ps("-ax"), "process_name")
另外,尽量使用'pgrep'
命令来代替'ps -A | grep 'process_name'
的
JKALAVIS的解决方案是好的,但我想补充的改善,而不是SHELL = TRUE的使用shlex。下面IM 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
干杯,