我是一个Python noob。
有些进程会在很长一段时间后退出,并且它们的状态会不断写入STDOUT。
如何在不等待进程退出的情况下运行进程并读取其STDOUT?
我试过了:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
o = p.communicate()[0] # Waits until process exits, also tried p.stdout.read()
print o # Isn't printed until process exists
do_something(o) # Doesn't get executed until process exits
答案 0 :(得分:1)
逐行阅读
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
for line in p.stdout:
do work here
p.wait()
if p.returncode != 0:
panic here
...居多。命令倾向于缓冲不同,具体取决于它们是从conole还是其他程序运行。由于你不是一个控制台,你可能会发现它的输出频率较低......但它最终会在程序退出之前到达那里。在linux上你可以使用pty或pexpect或者其他东西,但我知道在windows上没有好的解决方案。
现在,如果要并行运行它们,请在编程结束时为每个运行的命令创建一个线程并创建thread.join()。这本身有点棘手。你可以使用一个线程池(参见python 2.x上的multiprocessing.ThreadPool,不记得3.x中的名字)。