311

我想subprocess.check_output()ps -A | grep 'process_name'. 我尝试了各种解决方案,但到目前为止没有任何效果。有人可以指导我怎么做吗?

4

9 回答 9

542

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

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

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输出。

于 2012-11-11T14:58:02.073 回答
68

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

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

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

于 2012-11-11T16:35:06.177 回答
27

请参阅有关使用子流程设置管道的文档: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]
于 2013-06-16T00:48:09.240 回答
21

使用subprocess.run

import subprocess
    
ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
                              input=ps.stdout, capture_output=True)
print(processNames.stdout)
于 2020-11-12T00:50:29.713 回答
4

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

import sh
print sh.grep(sh.ps("-ax"), "process_name")
于 2012-11-12T05:54:58.913 回答
4

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

于 2012-11-13T10:34:47.927 回答
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)
于 2018-04-28T01:09:36.687 回答
0
command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])
于 2020-08-14T15:14:57.727 回答
-1

Python 3.5之后,您还可以使用:

    import subprocess

    f = open('test.txt', 'w')
    process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
    f.write(process.stdout)
    f.close()

该命令的执行是阻塞的,输出将在process.stdout中。

于 2019-12-02T15:06:49.600 回答