1

我正在尝试使用子进程在 python 中解析 sar 结果,每次我调用调用 sar 子进程的 python 代码时,它都会产生不同数量的行。这是重现此问题的最小程序:

import sys
import subprocess

fn = sys.argv[1]

p = subprocess.Popen(str('sar -r -f %s' % fn).split(' '), shell=True, stdout=subprocess.PIPE)
count = 0
while p.poll() is None:
    output = p.stdout.readline()
    count += 1

print "num lines = %d" % count

多次调用这个程序,每次产生不同数量的行:像这样

for i in {1..10}; do ./sarextractor.py /var/log/sysstat/sa02; done

直接在命令行上调用 sar 会产生恒定的行数:

for i in {1..10}; do sar -r -f /var/log/sysstat/sa02 | wc -l; done

知道这怎么会发生?

4

2 回答 2

1

假设 p.poll() 返回一个返回码但 p.stdout 缓冲区仍然保存一些数据?尝试这样的事情:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
    for line in p.stdout:
        count += 1

这将耗尽所有行的标准输出缓冲区。

于 2014-09-04T18:21:48.963 回答
1

我不确定你为什么在这里使用 poll ,但为什么不使用communicate

import sys
import subprocess

fn = sys.argv[1]

p = subprocess.Popen('sar -r -f %s' % fn.split(' '), shell=True, stdout=subprocess.PIPE)
outs, errs = p.communicate()
print("num lines = %d" % len(outs.splitlines())
于 2014-09-04T18:33:31.527 回答