如何通过外部Python脚本彻底关闭Selenium相关进程?
外部脚本关闭Selenium会话的解决方案
需求背景
需要从独立于Selenium运行脚本的外部Python脚本,实现类似driver.quit()的效果,干净终止所有Selenium相关进程。现有两个脚本:test.py启动Selenium会话,close_Selenium.py负责关闭会话。
现有尝试
1. 识别Selenium关联进程(test.py)
通过psutil获取chromedriver及其子进程:
import psutil from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("-headless=new") driver = webdriver.Chrome(options=options) driver.get('https://stackoverflow.com/') # 获取chromedriver进程实例 p = psutil.Process(driver.service.process.pid) # 打印所有子进程 print(p.children(recursive=True))
运行后输出关联进程PID列表:
[psutil.Process(pid=12740, name='conhost.exe', status='running', started='19:44:50'), psutil.Process(pid=12220, name='chrome.exe', status='running', started='19:44:50'), psutil.Process(pid=9588, name='chrome.exe', status='running', started='19:44:50'), psutil.Process(pid=2128, name='chrome.exe', status='running', started='19:44:50'), psutil.Process(pid=4112, name='chrome.exe', status='running', started='19:44:50'), psutil.Process(pid=11424, name='chrome.exe', status='running', started='19:44:50'), psutil.Process(pid=13064, name='chrome.exe', status='running', started='19:44:51'), psutil.Process(pid=6960, name='chrome.exe', status='running', started='19:44:51'), psutil.Process(pid=12864, name='chrome.exe', status='running', started='19:44:52')]
2. 手动关闭进程(close_Selenium.py)
手动复制PID后用os.kill终止,但最后一个进程报错:
import os os.kill(int(12740), 2) os.kill(int(12220), 2) os.kill(int(9588), 2) os.kill(int(2128), 2) os.kill(int(4112), 2) os.kill(int(11424), 2) os.kill(int(13064), 2) os.kill(int(6960), 2) os.kill(int(12864), 2)
报错信息:
os.kill(int(12864), 2) OSError: [WinError 87] The parameter is incorrect
疑问解答
1. 自动保存并读取PID
完全可以实现自动化,无需手动复制:
- 修改
test.py,将chromedriver自身PID及所有子进程PID写入文件:
import psutil from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("-headless=new") driver = webdriver.Chrome(options=options) driver.get('https://stackoverflow.com/') # 获取chromedriver进程 p = psutil.Process(driver.service.process.pid) # 保存PID到文件 with open('selenium_pids.txt', 'w') as f: # 写入chromedriver自身PID f.write(f"{p.pid}\n") # 写入所有递归子进程PID for child in p.children(recursive=True): f.write(f"{child.pid}\n")
- 修改
close_Selenium.py,读取文件并终止进程(增加异常处理避免报错):
import psutil with open('selenium_pids.txt', 'r') as f: pids = [int(line.strip()) for line in f if line.strip()] for pid in pids: try: proc = psutil.Process(pid) proc.terminate() # 优雅终止,也可以用proc.kill()强制终止 print(f"已终止进程PID: {pid}") except psutil.NoSuchProcess: print(f"进程PID {pid} 不存在,跳过")
2. 最后一个进程报错的原因
报错是因为该进程在执行os.kill前已经被终止(比如其他进程关闭时连带终止了它)。无需刻意保留或跳过,只需在关闭时增加异常处理,忽略不存在的进程即可,不会影响整体关闭效果。
3. 更高效干净的替代方案
方案一:直接查找并终止chromedriver进程(无需PID文件)
在close_Selenium.py中直接遍历系统进程,找到所有chromedriver.exe进程,递归终止其所有子进程:
import psutil for proc in psutil.process_iter(['name', 'pid']): if proc.info['name'].lower() == 'chromedriver.exe': try: # 终止chromedriver自身 proc.terminate() # 递归终止所有子进程 for child in proc.children(recursive=True): child.terminate() print(f"已终止chromedriver进程及其子进程,PID: {proc.info['pid']}") except psutil.NoSuchProcess: pass
这种方式无需在test.py中保存PID,直接在外部脚本完成清理,更灵活。
方案二:使用psutil的kill()或terminate()替代os.kill
os.kill在Windows下参数兼容性较差,psutil的进程方法更跨平台且安全:
proc.terminate():发送终止信号(类似Ctrl+C),优雅关闭进程proc.kill():强制终止进程(类似结束任务)
两种方法都会自动处理进程不存在的情况,配合异常捕获更稳定。
内容的提问来源于stack exchange,提问作者Claytor
相关产品推荐
相关产品推荐

