如何在Python循环中依次执行终端后台进程,等待前序进程完成再进下一轮
解决方案
问题根源
shell命令末尾的&会将目标程序放到后台执行,os.system仅会等待调用的shell进程本身退出,不会等待shell启动的后台子进程,因此会直接进入下一轮循环,导致多个进程同时运行。
方案1:使用subprocess模块(推荐)
subprocess是Python官方推荐的进程调用模块,默认会阻塞等待目标进程执行完成,同时可以灵活配置输出行为实现你要的「后台运行」(无前台输出、不占用终端)效果:
import subprocess for i in range(你的循环次数): # 此处为更新输入文件的代码 # 调用目标程序,阻塞等待执行完成,输出全部丢弃(等价于后台无输出运行) result = subprocess.run( ["program.x", "input.in", "output.out"], stdout=subprocess.DEVNULL, # 丢弃标准输出,需要保存日志的话替换为文件路径对应的文件对象即可 stderr=subprocess.DEVNULL, # 丢弃标准错误 check=False # 设为True的话程序执行报错会直接抛出Python异常 ) # 可选:通过返回码判断程序是否执行成功 if result.returncode != 0: print(f"第{i}轮执行失败,返回码:{result.returncode}")
方案2:保留os.system和&,新增wait命令
如果你不想改动现有代码结构,可以直接修改shell命令,在末尾加wait让shell主动等待后台进程执行完成后再退出:
import os command = 'program.x input.in output.out & wait' for i in range(你的循环次数): # 此处为更新输入文件的代码 os.system(command)
注意事项
- 方案1的安全性和可控性更高,若输入参数包含动态生成的内容,不会有shell注入风险,更推荐生产环境使用
- 两种方案都可以实现「程序后台运行、循环按顺序等待每轮执行完成后再进入下一轮」的需求
内容的提问来源于stack exchange,提问作者Aryan Bansal
相关产品推荐
相关产品推荐

