使用subprocess.Popen并行启动进程后Windows出现幽灵会话问题求助
解决Windows下多进程启动后的幽灵会话问题
问题根源
你当前的实现中,shell=True会额外创建cmd.exe进程来执行脚本/命令;对于test.cmd,直接调用python test.py会让父cmd进程阻塞等待Python进程结束,若父进程处理不当就会残留为"幽灵会话";同时直接用shell=True启动Python文件也会多创建一层cmd进程,加重残留风险。
解决方案
方案1:优化cmd脚本,让其执行后立即退出
修改test.cmd,用start命令启动Python进程,使原cmd脚本执行完直接退出:
call <anaconda_dir>/Scripts/activate.bat start "" python C:\Users\abc\Desktop\test.py
start ""会创建独立进程运行Python命令,原cmd脚本执行完毕即终止,不会残留- 若不需要显示窗口,可改为
start "" /min python C:\Users\abc\Desktop\test.py
方案2:优化父进程启动逻辑,减少冗余进程
修改parent.py,针对Python文件直接调用解释器(无需shell=True),给cmd脚本添加进程组标志:
import subprocess import sys p1 = "C:\\Users\\abc\\Desktop\\test.cmd" p2 = "C:\\Users\\abc\\Desktop\\test.py" for i in range(10): print(i) if i % 2 == 0: # 给cmd脚本设置独立进程组,避免父进程影响导致残留 subprocess.Popen(p1, shell=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) else: # 直接调用Python解释器启动脚本,无冗余cmd进程 subprocess.Popen([sys.executable, p2])
方案3:更可控的cmd启动方式(推荐)
结合前两种方案,用cmd /c显式启动脚本,进一步减少隐式进程创建:
import subprocess import sys p1 = "C:\\Users\\abc\\Desktop\\test.cmd" p2 = "C:\\Users\\abc\\Desktop\\test.py" for i in range(10): print(i) if i % 2 == 0: subprocess.Popen(["cmd", "/c", p1], creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) else: subprocess.Popen([sys.executable, p2])
同时保持test.cmd的start命令修改,双重保障进程正常退出。
验证方法
运行parent.py后,打开任务管理器查看进程:
- 初始会看到10个进程(5个cmd+5个python,或优化后仅10个python)
- 等待5秒(
test.py的sleep时间)后,所有相关进程应自动退出,无残留的cmd.exe幽灵会话
内容的提问来源于stack exchange,提问作者user17135505
相关产品推荐
相关产品推荐

