如何从python中的subprocess.call获取一行输出

2 投票
2 回答
1800 浏览
提问于 2025-04-18 12:19

我正在尝试从一个subprocess.call中提取一行内容,但到目前为止没有成功。我想用多个不同的subprocess.calls来做到这一点,这里举一个例子:

output = subprocess.call('vmstat -s, shell=True)

vmstat -s这个命令简单地返回当前内存状态的列表。我想读取第二行(已用内存),并把它存储在一个变量中,以便后续使用。

在Python中,最好的方法是什么呢?

谢谢

2 个回答

1

通常,从一个子进程的标准输出读取数据的方法是使用 communicate 这个方法。

>>> from subprocess import Popen, PIPE
>>> proc = Popen(['vmstat', '-s'], stdout=PIPE, stderr=PIPE)
>>> stdout, _stderr = proc.communicate()
>>> stdout.splitlines()[1]
'     13278652 K used memory'

需要注意的是,这里不需要使用 shell=True,而且在不必要的情况下,一般不推荐使用它(因为这样会增加不必要的开销,并且在某些情况下可能会导致安全漏洞)。

2

check_output 替代 call

>>> subprocess.check_output('vmstat -s', shell=True).splitlines()

另外,你也可以把 stdout 进行管道处理:

>>> from subprocess import Popen, PIPE
>>> for line in Popen('vmstat -s', shell=True, stdout=PIPE).stdout:
...     print(line)
... 
b'      3717436 K total memory\n'
b'      2151640 K used memory\n'
b'      1450432 K active memory\n'
...

撰写回答