Python-使用子流程获取实时输出
我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我一看到包装程序的输出,就能够看到它的每一行。
我认为我只是使用subprocess.Popen
,use
来执行程序stdout=PIPE
,然后读取其中的每一行并相应地对其进行操作。但是,当我运行以下代码时,输出似乎被缓冲在某处,导致它出现在两个块中,第1到332行,然后是333到439行(输出的最后一行)
from subprocess import Popen, PIPE, STDOUTp = 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*
)?
回答:
我尝试了这个,并且出于某种原因而在代码中
for line in p.stdout: ...
积极地缓冲,变体
while True: line = p.stdout.readline()
if not line: break
...
以上是 Python-使用子流程获取实时输出 的全部内容, 来源链接: utcz.com/qa/411027.html