Python调用subprocess.Popen.kill无法关闭Chrome浏览器窗口怎么办
问题原因
- Chrome默认采用多进程架构,你通过
subprocess.Popen启动的只是Chrome的主调度进程,后续打开页面、渲染PDF的都是它 fork 出来的子进程,只调用a.kill()杀主进程不会影响子进程运行,所以窗口会保留。 - 模拟
ctrl+w无效是因为快捷键触发时Chrome窗口没有处于前台激活状态,按键指令没有被Chrome捕获。
修复方案
方案1:最小改动适配现有逻辑(推荐)
先安装psutil库用来完整杀掉进程树:
pip install psutil
修改后的代码如下:
import time import subprocess import keyboard import psutil def chrome(): test = "test" name = "file:///C://Users//akcgo//Documents//CARB//ARBER//PDFS//Company A.pdf" # 启动时加参数让Chrome开独立新窗口,避免和已有Chrome进程合并 a = subprocess.Popen([ "C://Program Files (x86)//Google//Chrome//Application//chrome.exe", "--new-window", name # 直接传入PDF路径,不用模拟键盘输入更稳定 ]) time.sleep(1) keyboard.press_and_release(['ctrl', 'p']) time.sleep(1) keyboard.press_and_release('enter') time.sleep(1) keyboard.write(test) time.sleep(.5) keyboard.press_and_release('enter') time.sleep(2) # 杀掉整个进程树,包含所有子进程 parent = psutil.Process(a.pid) for child in parent.children(recursive=True): child.kill() parent.kill()
方案2:不用第三方库的Windows兼容方案
如果不想装额外库,可以直接调用Windows系统的taskkill命令杀掉关联的所有Chrome进程,注意如果有其他手动打开的Chrome窗口也会被一起关闭,适合只有自动化脚本用Chrome的场景:
把最后的a.kill()替换成:
subprocess.run(["taskkill", "/F", "/T", "/PID", str(a.pid)], capture_output=True)
额外优化建议
可以在Chrome启动参数里加--kiosk-printing,开启静默打印模式,触发打印后会自动走默认打印机(你设置的PDF保存),不需要手动按回车确认,能减少模拟按键的步骤,降低出错概率。
内容的提问来源于stack exchange,提问作者acruz23
相关产品推荐
相关产品推荐

