2014-09-04 3 views
1

Я пытаюсь проанализировать результаты sar в python, используя подпроцесс, каждый раз, когда я вызываю код 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 

Вызов сар непосредственно в командной строке производит постоянное число линий:

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 

Это приведет к утечке буфера stdout всех его линий.

+0

Спасибо, что это работает !! –

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

Спасибо. Это работает. Фактически оба ответа работают. Я дам правильный ответ другому парню с очень небольшим количеством очков :) –

Смежные вопросы