我正在尝试为命令行程序(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', '')
在看了一些关于 subprocess 的文档之后,我发现了bufsize
to 的参数Popen
,所以我尝试将 bufsize 设置为 1(每行缓冲)和 0(无缓冲),但是这两个值似乎都没有改变传递行的方式。
在这一点上,我开始抓住稻草,所以我编写了以下输出循环:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
但得到了相同的结果。
是否可以获得使用子进程执行的程序的“实时”程序输出?Python 中是否还有其他向前兼容的选项(不是exec*
)?