从子进程获取进度消息

tbo*_*der 21 python subprocess

我想开始一个需要几分钟才能完成的程序.在此期间,我想阅读程序的进度消息(打印在标准输出上).问题是我找不到在运行期间读出输出的方法.

我发现读取程序输出的唯一函数是Popen.communicate(),但是这个方法一直等到进程完成.因此,无法获得进度并以特殊格式化方式使用户可见.

是否有可能以另一种方式做到这一点?

当我subprocess.popen使用我的脚本运行该过程时,我在屏幕上看到程序的输出.有可能隐藏它吗?(Ubuntu 10.10,普通终端)

chm*_*lig 20

最简单的方法是使用关键字参数调用Popen stdout=subprocess.PIPE.

p = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
while True:
    line = p.stdout.readline()
    if not line:
        break
    print line
Run Code Online (Sandbox Code Playgroud)

要查看此操作,以下是两个示例脚本.将它们放在同一目录中并运行python superprint.py

printandwait.py:

import time
import sys
print 10
sys.stdout.flush()
time.sleep(10)
print 20
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

superprint.py:

import subprocess
import sys
p = subprocess.Popen(["python printandwait.py"], shell=True, stdout=subprocess.PIPE)
while True:
    print "Looping"
    line = p.stdout.readline()
    if not line:
        break
    print line.strip()
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)