如何在循环中启动多个subprocess.Popen进程后等待所有进程完成?
如何在循环中启动多个subprocess.Popen进程后等待所有进程完成?
其实你想到的思路完全没问题,这也是处理这类并行进程等待场景的常规操作,一点都不“不优雅”哦~
具体做法很直接:
- 首先在循环里把每个启动的
subprocess.Popen对象都存到一个列表里 - 等所有进程都启动完毕后,再遍历这个列表,逐个等待进程结束
代码示例如下:
import subprocess processes = [] for filename in filenames: proc = subprocess.Popen( f"snt_sim -yaml {filename}", shell=True, stdout=subprocess.DEVNULL ) processes.append(proc) # 等待所有进程完成 for proc in processes: proc.wait()
这里用wait()就足够了,因为你已经把stdout重定向到了DEVNULL,不需要获取进程的输出内容。如果之后需要处理stdout或者stderr,再用communicate()就行,它会等待进程结束并返回输出结果。
这种方式的优势在于所有进程都是并行启动的,不会在循环里逐个阻塞,完全符合你“先全部启动,再统一等待”的需求。
要是你想尝试更高级的写法,也可以用concurrent.futures模块配合subprocess.run()来实现,但对于这种简单场景来说,存Popen对象到列表再逐个等待的方式已经足够简洁高效了。
备注:内容来源于stack exchange,提问作者Kiffikiffe
相关产品推荐
相关产品推荐

