Python Selenium调用webdriver.quit()后Chrome.exe后台进程未终止问题
webdriver.quit()后后台进程残留的问题 我之前也踩过这个坑,尤其是在Windows环境下用Python调度器反复跑Selenium任务时,后台chrome.exe堆得内存直接告警。结合你的场景,给你几个经过验证的实用解决方案:
1. 显式清理Chrome进程树(最推荐)
webdriver.quit()有时候只终止了Driver本身的进程,没彻底杀掉它启动的所有Chrome子进程。我们可以用psutil库追踪并终止整个关联进程树,确保不留尾巴。
首先安装psutil:
pip install psutil
然后修改你的代码,在driver.quit()之后加上进程清理逻辑:
import psutil from selenium import webdriver def run_selenium_task(): driver = webdriver.Chrome() try: # 这里放你的业务操作代码,比如页面跳转、元素交互等 driver.get("https://example.com") finally: # 先执行Driver退出 driver.quit() # 获取Driver进程的ID driver_pid = driver.service.process.pid # 找到该进程下所有关联的Chrome子进程 parent_process = psutil.Process(driver_pid) child_processes = parent_process.children(recursive=True) # 逐个终止子进程 for proc in child_processes: try: proc.kill() except psutil.NoSuchProcess: # 进程已不存在就跳过 pass
这个方法能确保每次任务结束后,所有关联的Chrome进程都被彻底清理,不会持续积累。
2. 通过ChromeOptions限制后台进程生成
如果你不想额外依赖psutil,可以尝试给Chrome添加启动参数,减少不必要的后台进程生成。不过要注意,这些参数可能影响Chrome的部分功能,需要根据你的业务场景测试:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 禁用Chrome的进程启动器zygote,减少子进程生成 chrome_options.add_argument("--no-zygote") # 强制单进程运行(复杂页面可能不稳定,谨慎使用) chrome_options.add_argument("--single-process") # 禁用沙箱(部分Windows环境下需要) chrome_options.add_argument("--no-sandbox") driver = webdriver.Chrome(options=chrome_options) # 执行操作... driver.quit()
3. 确保调度器任务的资源闭环
如果用的是APScheduler这类Python调度器,一定要在任务函数里用try...finally块,保证不管任务成功还是失败,Driver退出和进程清理的逻辑都会执行。避免因为任务抛出异常导致Driver对象未被正确销毁,进而残留进程。
补充说明
你提到退出Python调度器后所有Chrome进程都会消失,这是因为这些残留的chrome.exe都是调度器进程的子进程,当父进程退出时,Windows系统会自动回收这些子进程。但问题在于调度器长期运行时,这些子进程会不断积累占满内存,所以必须在每次任务结束时主动清理。
另外,记得检查Chrome浏览器和Chrome Driver的版本是否严格匹配——有时候版本不兼容也会导致进程回收异常,虽然你用了最新Selenium,但还是要确认Driver版本和Chrome版本对应。
内容的提问来源于stack exchange,提问作者Sion C

