2014-09-04 32 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

相關問題