我正在尝试为命令行程序(svnadmin verify)编写一个包装脚本,它将显示一个很好的操作进度指示器。这要求我能够在包装程序输出后立即看到输出的每一行。
我想我只需使用以下命令执行该程序subprocess.Popen
, use 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', '')
稍微查看了有关子流程的文档后,我发现了bufsize
参数为Popen
,所以我尝试将 bufsize 设置为 1(缓冲每行)和 0(无缓冲),但这两个值似乎都没有改变行的传递方式。
此时我开始抓住救命稻草,所以我编写了以下输出循环:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
但得到了相同的结果。
是否可以获得使用子进程执行的程序的“实时”程序输出? Python 中是否还有其他向前兼容的选项(不是exec*
)?