在Python中调用sar会产生奇怪的结果

在Python中调用sar会产生奇怪的结果,python,bash,sar,Python,Bash,Sar,我试图使用subprocess在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() i

我试图使用subprocess在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
知道怎么会发生这种情况吗?

假设p.poll()返回一个返回码,但p.stdout缓冲区仍然保存一些数据?请尝试以下方法:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
    for line in p.stdout:
        count += 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())

谢谢它正在工作。事实上,这两个答案都有效。我会给另一个人一个正确的答案,只需要很少的分数:)