You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Python脚本在其启动的所有程序关闭后自动终止?

解决脚本在所有子进程关闭后自动终止的问题

原代码的问题分析

  1. back_insert函数逻辑错误:函数中判断if flist == " "永远不成立(flist是字符列表,而" "是字符串),导致路径中的空格根本没被转义。更关键的是,这个函数完全没必要——subprocess.Popen支持直接传递列表形式的命令,会自动处理带空格的路径,无需手动添加反斜杠。
  2. 进程等待方式可能导致异常挂起:如果某个启动的程序会fork子进程(父进程退出后子进程继续运行),或者进程变成僵尸状态,p.wait()可能无法正确识别进程已终止,导致脚本卡住。

修正后的代码

import subprocess
from subprocess import Popen
import time

# 直接定义程序路径,无需手动转义空格
commands = [
    "/bin/QUsb2Snes",
    "/home/user/LibreSplit/libresplit",
    "/usr/share/OpenTracker/OpenTracker",
    "/usr/bin/snes9x-gtk"
]

# 启动所有进程:用列表形式传递命令,自动处理空格,避免shell注入风险
procs = []
for cmd in commands:
    # 直接以列表形式传递命令,subprocess会自动处理路径中的空格
    proc = Popen([cmd])
    procs.append(proc)

# 循环检查所有进程是否已终止
while True:
    all_terminated = True
    for p in procs:
        # poll()返回None表示进程仍在运行,否则返回退出码
        if p.poll() is None:
            all_terminated = False
            break
    if all_terminated:
        print("所有程序已关闭,脚本退出")
        break
    # 每秒检查一次,避免占用过多资源
    time.sleep(1)

关键改进点

  • 移除无效的路径转义函数:使用subprocess.Popen的列表参数模式,既安全又能自动处理路径空格。
  • 主动检查进程状态:通过循环调用poll()判断进程是否存活,确保所有进程真正终止后再退出脚本,避免因进程特殊行为导致的挂起。
  • 避免shell注入风险:不使用shell=True,直接传递命令列表是subprocess模块的推荐用法。

内容的提问来源于stack exchange,提问作者Believe82

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:04:51