我想“播种”一些过程,然后“收获”他们当他们完成。使用subprocess
模块,我在subrun.py
中有以下代码:
import time, subprocess, shlex, os
ok = subprocess.Popen(shlex.split("python ok.py"),
stdout=subprocess.PIPE,
stderr=open(os.devnull, 'w'))
nok = subprocess.Popen(shlex.split("python nok.py"),
stdout=subprocess.PIPE,
stderr=open(os.devnull, 'w'))
procs = {'ok': ok, 'nok': nok}
while procs:
running = procs.keys()
print "running:", running
for k in running:
proc = procs[k]
rc = proc.poll()
if rc is None:
pass # still running
else:
del procs[k]
print proc.stdout.read()
time.sleep(.4)
ok.py
如下
import sys
print "OK"
sys.exit(0)
而nok.py
是
import sys
print "NOK" * 5000
sys.exit(0)
输出为
(dev) C:\work\dev\test>python subrun.py
running: ['ok', 'nok']
running: ['ok', 'nok']
OK
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
running: ['nok']
Traceback (most recent call last):
File "subrun.py", line 27, in <module>
time.sleep(.4)
当子进程在IO上被阻塞时,即Popen.poll()
返回None
。你知道吗
我可能会为每个进程启动一个线程,这将调用.communicate()[0]
,但这似乎需要很多额外的簿记。。。你知道吗
有什么办法可以让它发挥作用吗?你知道吗
如果设置
stdout=PIPE
,那么应该读取管道,否则如果子进程生成足够的输出,它可能会永远阻塞。你知道吗这是代码中的一个bug。修好它。你知道吗
要在子进程完成后获取所有输出,请执行以下操作:
相关问题 更多 >
编程相关推荐