我试图使用子进程在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
任何想法怎么会发生这种情况?
答案 0 :(得分:1)
假设p.poll()返回一个返回码,但p.stdout缓冲区仍然保存一些数据?尝试这样的事情:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
count += 1
这将耗尽其所有行的stdout缓冲区。
答案 1 :(得分: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())