You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:53:16