Pythonsubprocess命令与pipe道

我想用ps -A | grep 'process_name'来使用subprocess.check_output() ps -A | grep 'process_name' 。 我尝试了各种解决scheme,但迄今没有任何工作 有人可以指导我如何做到这一点?

要在subprocess模块中使用pipe道,必须通过shell=True

然而,由于各种原因,这并不是真正可取的,尤其是安全性。 相反,分别创buildpsgrep进程,并将输出从一个input到另一个,如下所示:

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

然而,在你的特定情况下,简单的解决scheme是调用subprocess.check_output(('ps', '-A')) ,然后在输出上str.find

或者你可以在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 

通信方法返回一个元组中的标准输出和标准错误。

请参阅使用子stream程设置pipe道的文档: http : //docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

我还没有testing下面的代码示例,但它应该大致是你想要的:

 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] 

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

您可以尝试sh.py中的pipe道function:

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

你可以试试

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

要么

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

显示所有进程:

 pstree -a 

按用户显示:

 pstree user