使用Python subprocess终止运行中程序的CMD终端问题
问题根源
你当前代码里记录的PID是start命令的PID,而非实际运行的cmd.exe或python.exe的PID。start是Windows Shell的内置命令,它启动cmd.exe后会立即退出,杀掉这个PID对正在运行的cmd窗口完全无效,这就是5个窗口始终留存的原因。
解决方案
直接启动cmd.exe并通过creationflags参数创建新控制台窗口,让subprocess.Popen返回cmd.exe的真实PID,后续用taskkill就能彻底终止对应窗口及其中的Python进程。
修改后的main.py代码
import time import subprocess cmd2 = "python test.py" pid_lst = [] for i in range(5): # 直接启动cmd.exe,用CREATE_NEW_CONSOLE创建新窗口,不再依赖start命令 b = subprocess.Popen( ["cmd.exe", "/k", cmd2], creationflags=subprocess.CREATE_NEW_CONSOLE ) pid_lst.append(b.pid) print(f"启动进程PID: {b.pid}") time.sleep(1) while len(pid_lst) > 2: x = pid_lst.pop(0) # /F强制终止,/T连带终止子进程(即cmd里的python.exe) cmd_2 = f"taskkill /PID {x} /F /T" try: subprocess.run(cmd_2, check=True) print(f"已终止进程PID: {x}") except subprocess.CalledProcessError as e: print(f"终止进程{x}失败: {e}")
关键改动说明
- 移除
start /wait命令,直接调用cmd.exe,通过subprocess.CREATE_NEW_CONSOLE创建新控制台窗口,确保获取的是cmd.exe的真实PID。 taskkill新增/T参数,会终止目标进程及其所有子进程,避免只关闭cmd窗口但Python进程仍在后台运行。- 用
subprocess.run()替代Popen,更方便捕获执行错误,确保命令执行状态可追踪。
内容的提问来源于stack exchange,提问作者OneTouchForHeight
相关产品推荐
相关产品推荐

