4

SO上有很多帖子,比如这个:Store output of subprocess.Popen call in a string

复杂的命令有问题。例如,如果我需要从中获取输出

ps -ef|grep 某事|wc -l

子进程不会做这项工作,因为子进程的参数是[程序名称,参数],所以不可能使用更复杂的命令(更多程序、管道等)。

有没有办法捕获多个命令链的输出?

4

3 回答 3

5

只需将shell=True选项传递给子进程

import subprocess
subprocess.check_output('ps -ef | grep something | wc -l', shell=True)
于 2013-02-20T02:42:26.703 回答
5

对于使用 subprocess 模块的无外壳、干净的版本,您可以使用以下示例(来自文档):

output = `dmesg | grep hda`

变成

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

Python 程序在这里基本上做了 shell 所做的事情:它将每个命令的输出依次发送到下一个命令。这种方法的一个优点是程序员可以完全控制命令的单个标准错误输出(如果需要,它们可以被抑制、记录等)。

也就是说,我通常更喜欢使用subprocess.check_output('ps -ef | grep something | wc -l', shell=True)nneonneo 建议的 shell-delegation 方法:它是通用的、非常清晰且方便的。

于 2013-02-20T02:43:59.470 回答
3

好吧,另一种选择就是用纯 Python 实现部分命令。例如,

count = 0
for line in subprocess.check_output(['ps', '-ef']).split('\n'):
    if something in line: # or re.search(something, line) to use regex
        count += 1
print count
于 2013-02-20T02:39:45.293 回答