我正在尝试编写一个包装脚本,用于命令行程序(svnadmin verify),该程序作为进度指示器用来友好的显示具体操作进度。这需要我能够看到封装程序输出的每一行内容,并立即显示出来。
我想我只需要使用 subprocess.Popen
执行程序,使用 stdout=PIPE
,然后读入的每一行并相应地执行它。但是,当我运行以下代码时,输出似乎在某个地方被缓冲了,导致它出现在两个块中,第1行到332行,然后是333行到439行(输出的最后一行)
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', '')
在查看子进程文档后,我发现 Popen
的 bufsize
参数,因此我尝试将 bufsize 设置为1(每行缓冲) 和 0(无缓冲),但这两个值似乎都没有改变行被传递的方式。。
在这一点上,我开始拼命地寻找出路,所以我编写了下面的输出循环。:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
却得到了同样的结果。
是否有可能获得使用子进程执行的程序的“实时”程序输出?Python 中还有其他向前兼容的选项(不是 exec*
)吗?