2014-09-04 76 views
1

我想解析使用子进程的python的sar结果,每当我调用调用sar子进程的python代码时,它会产生不同数量的行。 这里的一个最小的程序以重现此问题:在Python中调用sar产生奇怪的结果

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 

任何想法这怎么会发生?

回答

1

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

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

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

+0

谢谢它的作品! – 2014-09-26 07:47:12

1

我不确定你为什么在这里使用民意调查,但为什么不使用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()) 
+0

谢谢。这是工作。其实这两个答案都有效。我会以很少的分数给予其他人正确的答案:) – 2014-09-26 07:47:56