如何让Python在所有子进程完成后再执行指定代码?
解决Python等待所有子进程完成后执行后续代码的问题
你的代码逻辑本身没问题,但可能因为shell=True的特性导致等待失效——当用shell=True时,Popen启动的是shell进程而非你实际要执行的命令进程,如果目标命令在shell后台运行(比如加了&),shell会提前退出,此时process.wait()只能等到shell结束,而非真正的命令完成。下面是几种可行的解决办法:
方法一:去掉shell=True(推荐)
如果你的commands是列表形式(比如["ls", "-l"]),直接去掉shell=True,让Popen直接启动目标进程,wait()就能准确等待进程结束:
import subprocess import time processes = [] for command in commands: # command 需为列表格式,例如 ["echo", "hello world"] process = subprocess.Popen(command) processes.append(process) time.sleep(3) for process in processes: process.wait() _nextLine()
方法二:保留shell=True并确保正确等待
如果必须用shell=True(比如命令包含管道、通配符等shell专属特性),要确保命令是前台执行的(不要加&让它后台跑),同时可以用communicate()替代wait(),还能顺便捕获输出:
import subprocess import time processes = [] for command in commands: process = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) processes.append(process) time.sleep(3) for process in processes: # communicate()会阻塞到进程结束,同时返回标准输出和错误 stdout, stderr = process.communicate() # 可选:打印或处理输出内容 # print("输出:", stdout.decode()) # print("错误:", stderr.decode()) _nextLine()
方法三:用subprocess.run+线程池简化并行执行
如果不需要在启动子进程后做额外操作,直接用subprocess.run结合线程池实现并行启动,等待全部完成:
import subprocess from concurrent.futures import ThreadPoolExecutor def execute_command(command): # 根据需求调整shell参数 subprocess.run(command, shell=True, check=False) # 用线程池并行执行所有命令,自动等待全部完成 with ThreadPoolExecutor() as executor: executor.map(execute_command, commands) _nextLine()
内容的提问来源于stack exchange,提问作者Anirudh
相关产品推荐
相关产品推荐

