Python调用subprocess.run启动外部程序后脚本阻塞无法继续执行怎么办?
问题原因
subprocess.run() 方法默认会等待启动的外部程序完全退出后才会返回,因此你的脚本会卡在调用行直到外部程序关闭,后续print语句才会执行,这是该方法的正常设计逻辑。
解决方案
1. 实现非阻塞启动外部程序
将subprocess.run替换为subprocess.Popen,该方法启动外部程序后会立即返回,不会阻塞后续代码执行:
import subprocess # 启动外部程序后立即返回,不等待程序退出 proc = subprocess.Popen("C:\\Program.exe") print('yes') # 该行代码会在程序启动后立刻执行
2. 检测外部程序运行状态
通过subprocess.Popen返回的实例对象的poll()方法,即可判断程序运行状态:
poll()返回None:外部程序仍在运行poll()返回数值:外部程序已退出,返回值为程序的退出码
状态检测示例代码:
import subprocess import time # 启动外部程序 proc = subprocess.Popen("C:\\Program.exe") print('外部程序启动完成,后续代码正常执行') # 定时检测运行状态 while True: run_status = proc.poll() if run_status is None: print("外部程序正在运行") else: print(f"外部程序已退出,退出码为:{run_status}") break time.sleep(2) # 间隔2秒检测,降低CPU占用
注意事项
- 如果外部程序路径含空格,或者需要传入启动参数,建议将命令拆分为列表传入,避免解析错误,示例:
subprocess.Popen(["C:\\Program Files\\Test.exe", "--debug", "1"]) - 如果不需要捕获外部程序的输出、错误日志,无需额外配置
stdin/stdout/stderr参数,默认会继承当前Python进程的输入输出配置
内容的提问来源于stack exchange,提问作者Pythonista
相关产品推荐
相关产品推荐

