如何在Python中终止subprocess启动的Chrome进程以关闭浏览器并退出Selenium
精准终止subprocess启动的Chrome的实现方法
核心注意点
- 原代码存在两个容易导致终止失败的逻辑问题:
- 启动subprocess时未保存返回的进程对象,且开启了
shell=True,此时拿到的进程句柄是cmd.exe而非Chrome本身,直接终止会导致Chrome残留不退出 - 初始化Selenium时未关联提前启动的带调试端口的Chrome实例,Selenium会自动新开一个独立的Chrome窗口,和subprocess启动的进程无关联
- 启动subprocess时未保存返回的进程对象,且开启了
- 禁止直接使用全局
taskkill /f /im chrome.exe这类命令,会误杀掉用户日常打开的其他Chrome窗口
实现步骤
- 修正启动逻辑,保存Chrome进程句柄
去掉shell=True,将启动参数拆分为列表形式,让Popen直接启动Chrome主进程,拿到可操作的进程对象:chrome_process = subprocess.Popen([ r"C:\Program Files\Google\Chrome\Application\chrome.exe", "--remote-debugging-port=9222", "--incognito" ]) - 关联Selenium和提前启动的Chrome实例
在ChromeOptions中添加调试端口配置,让Selenium接管已启动的Chrome窗口,避免重复开新窗口:options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") - 按正确顺序终止进程
先断开Selenium和Chrome的连接、清理chromedriver残留,再给Chrome发终止信号,避免抛出未处理的连接异常:# 先退出Selenium连接 driver.quit() # 给Chrome发正常关闭信号 chrome_process.terminate() # 等待进程退出,超时则强杀 try: chrome_process.wait(timeout=3) except subprocess.TimeoutExpired: chrome_process.kill()
兜底方案(无进程句柄时精准定位)
如果因为代码历史原因无法保存初始的进程句柄,可以借助psutil库遍历系统进程,匹配带对应调试端口参数的Chrome进程精准终止,不会误杀其他Chrome窗口:
import psutil for proc in psutil.process_iter(['name', 'cmdline']): # 匹配Chrome进程,且命令行带9222调试端口参数 if proc.name() == "chrome.exe" and proc.cmdline(): if any("--remote-debugging-port=9222" in arg for arg in proc.cmdline()): proc.terminate()
内容的提问来源于stack exchange,提问作者scraper
相关产品推荐
相关产品推荐

