2014-09-04 3 views
1

파이썬에서 sar 결과를 구문 분석하려고하는데, 파이썬 코드를 호출 할 때마다 다른 수의 라인을 생성합니다. 다음은이 문제를 재현 할 수있는 최소한의 프로그램 :이 프로그램을 여러 번 호출파이썬에서 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 

이 라인의 다른 번호를 매번 생산 : 직접 명령 행에 대한 SAR를 호출이

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

감사합니다. 그것은 효과가있다. 실제로 두 응답은 모두 작동합니다. 나는 아주 적은 점수로 다른 사람에게 바른 답을 줄 것이다. :) –

관련 문제