You need to enable JavaScript to run this app. 如何在Python中终止subprocess启动的Chrome进程以关闭浏览器并退出Selenium
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中终止subprocess启动的Chrome进程以关闭浏览器并退出Selenium

精准终止subprocess启动的Chrome的实现方法

核心注意点

  • 原代码存在两个容易导致终止失败的逻辑问题:
    • 启动subprocess时未保存返回的进程对象,且开启了shell=True,此时拿到的进程句柄是cmd.exe而非Chrome本身,直接终止会导致Chrome残留不退出
    • 初始化Selenium时未关联提前启动的带调试端口的Chrome实例,Selenium会自动新开一个独立的Chrome窗口,和subprocess启动的进程无关联
  • 禁止直接使用全局taskkill /f /im chrome.exe这类命令,会误杀掉用户日常打开的其他Chrome窗口

实现步骤

  1. 修正启动逻辑,保存Chrome进程句柄
    去掉shell=True,将启动参数拆分为列表形式,让Popen直接启动Chrome主进程,拿到可操作的进程对象:
    chrome_process = subprocess.Popen([
        r"C:\Program Files\Google\Chrome\Application\chrome.exe",
        "--remote-debugging-port=9222",
        "--incognito"
    ])
    
  2. 关联Selenium和提前启动的Chrome实例
    在ChromeOptions中添加调试端口配置,让Selenium接管已启动的Chrome窗口,避免重复开新窗口:
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    
  3. 按正确顺序终止进程
    先断开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 11:54:03