Python:如何获取多个系统命令的最终输出?

4 投票
3 回答
2623 浏览
提问于 2025-04-17 16:27

在这里有很多关于这个话题的帖子,比如这个:如何将subprocess.Popen调用的输出存储在字符串中

问题出在一些复杂的命令上。例如,如果我想获取以下命令的输出:

ps -ef|grep something|wc -l

使用subprocess可能无法完成这个任务,因为subprocess的参数格式是[程序名称,参数],所以无法使用更复杂的命令(比如多个程序、管道等)。

有没有办法捕获多个命令连在一起的输出呢?

3 个回答

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
5

如果你想用不依赖于命令行的干净方式来处理,可以使用下面这个例子(来自文档):

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程序基本上做的事情和命令行一样:它把每个命令的输出依次传递给下一个命令。这样做的一个好处是,程序员可以完全控制每个命令的错误输出(如果需要,可以选择不显示、记录等)。

不过,我个人更喜欢使用 nneonneo 提出的 subprocess.check_output('ps -ef | grep something | wc -l', shell=True) 这种方式:它比较通用,阅读起来也很清晰方便。

5

只需要在调用子进程的时候加上 shell=True 这个选项就可以了。

import subprocess
subprocess.check_output('ps -ef | grep something | wc -l', shell=True)

撰写回答