我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我一看到包装程序的输出,就能够看到它的每一行。
我认为我只是使用subprocess.Popen,use 来执行程序stdout=PIPE,然后读取其中的每一行并相应地对其进行操作。但是,当我运行以下代码时,输出似乎被缓冲在某处,导致它出现在两个块中,第1到332行,然后是333到439行(输出的最后一行)
subprocess.Popen
use
stdout=PIPE
from subprocess import Popen, PIPE, STDOUT p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE, stderr = STDOUT, shell = True) for line in p.stdout: print line.replace('\n', '')
在稍微了解一下子流程的文档之后,我发现了bufsize参数Popen,因此我尝试将bufsize设置为1(每行缓冲)和0(没有缓冲),但是两个值似乎都没有改变行的传递方式。
在这一点上,我开始精通吸管,因此编写了以下输出循环:
while True: try: print p.stdout.next().replace('\n', '') except StopIteration: break
但是得到了相同的结果。
是否可以获取使用子进程执行的程序的“实时”程序输出?Python中是否还有其他一些向前兼容的选项(不是exec*)?
exec*
我尝试了这个,并且出于某种原因而在代码中
for line in p.stdout: ...
积极地缓冲,变体
while True: line = p.stdout.readline() if not line: break ...