Python脚本调用subprocess.run()时挂起无报错该如何解决?
问题根因
subprocess.run()的默认行为是阻塞等待被调用的子进程完全退出后才会返回并执行后续代码,你遇到的脚本挂起属于该方法的正常设计逻辑,并不是运行异常,所以现有的异常捕获逻辑无法捕捉到该现象。
解决方案
根据你的使用需求可以选择以下两种方案:
方案1:仅启动应用不阻塞后续脚本,不需要后续控制应用进程
Windows平台可以直接调用系统自带的start命令启动独立进程,启动完成后脚本会立即继续运行,无需等待应用关闭:
import subprocess def open_app(location): try: # start 后的空双引号为窗口标题占位符,避免路径带空格时出现解析错误 # 加check=True后启动失败会主动抛出异常,可被现有捕获逻辑捕捉 subprocess.run(f'start "" "{location}"', shell=True, check=True) except subprocess.SubprocessError as error: print(error)
方案2:需要后续控制启动的应用进程
使用非阻塞的subprocess.Popen()方法,该方法启动应用后会立即返回进程对象,不会等待应用退出,你可以保存返回的进程对象用于后续的状态查询、主动关闭等操作:
import subprocess def open_app(location): proc = None try: # 路径存在空格时可以把参数改为列表形式:subprocess.Popen([location]) proc = subprocess.Popen(location, shell=True) # 后续可通过 proc.terminate() 主动关闭该应用,通过 proc.poll() 查询进程是否运行 except subprocess.SubprocessError as error: print(error) return proc
补充说明
如果不希望启动应用时弹出额外的控制台窗口,可以在subprocess.Popen或subprocess.run的参数中添加creationflags=subprocess.CREATE_NO_WINDOW(仅Windows平台生效)。
内容的提问来源于stack exchange,提问作者Nicke7117
相关产品推荐
相关产品推荐

