Pyinstaller打包Python脚本后Selenium-manager.exe弹窗问题求助
问题:Pyinstaller打包Selenium脚本后弹出selenium-manager.exe控制台窗口
- 现象:使用Selenium配置无头浏览器时,将脚本通过Pyinstaller打包为可执行文件后,会短暂弹出名为
selenium-manager.exe的黑色控制台窗口,随后自动关闭;该窗口并非chromedriver.exe窗口(已通过CREATE_NO_WINDOW处理chromedriver的控制台显示)。直接运行Python脚本则无此问题。 - 已尝试操作:使用
pyinstaller --windowed my_script.py命令打包,以及添加--noconsole参数或单独使用该参数,均无法解决问题。 - 环境信息:Windows 10 10.0.19045-SP0,Python 3.11.1,Selenium 4.10.0,Pyinstaller 5.13.0
- 代码示例:
from subprocess import CREATE_NO_WINDOW from selenium.webdriver.chrome.service import Service from selenium.webdriver import Chrome, ChromeOptions def setup_options(options: ChromeOptions) -> ChromeOptions : options.add_argument('--headless=new') options.add_argument('--disable-extensions') options.add_argument('--disable-infobars') options.add_argument('--no-sandbox') return options def setup_driver() -> Chrome: service_chrome = Service() service_chrome.creation_flags = CREATE_NO_WINDOW options = setup_options(ChromeOptions()) return Chrome(service=service_chrome, options=options) driver = setup_driver() # 执行自动化操作 driver.quit()
- 窗口说明:弹出的窗口为标准Windows控制台窗口,标题栏显示
selenium-manager.exe,窗口短暂出现后立即关闭。
原因及解决办法
原因
Selenium 4.x版本引入了Selenium Manager工具,用于自动检测、下载和匹配浏览器驱动。当Pyinstaller打包脚本后,Selenium Manager会以子进程形式启动,而当前代码仅对chromedriver设置了CREATE_NO_WINDOW来隐藏控制台,未对Selenium Manager的启动做对应处理;同时Pyinstaller的--windowed/--noconsole参数仅管控主进程的控制台显示,无法影响Selenium启动的子进程。
解决办法
方案1:通过环境变量禁用Selenium Manager控制台
在代码最开头添加环境变量设置,确保在Selenium模块初始化前生效,让Selenium Manager启动时不显示控制台:
import os # 设置环境变量,禁止Selenium Manager弹出控制台 os.environ['SE_MANAGER_SKIP_CONSOLE'] = '1' # 之后再导入Selenium相关模块 from subprocess import CREATE_NO_WINDOW from selenium.webdriver.chrome.service import Service from selenium.webdriver import Chrome, ChromeOptions # 后续代码保持不变 def setup_options(options: ChromeOptions) -> ChromeOptions : options.add_argument('--headless=new') options.add_argument('--disable-extensions') options.add_argument('--disable-infobars') options.add_argument('--no-sandbox') return options def setup_driver() -> Chrome: service_chrome = Service() service_chrome.creation_flags = CREATE_NO_WINDOW options = setup_options(ChromeOptions()) return Chrome(service=service_chrome, options=options) driver = setup_driver() # 执行自动化操作 driver.quit()
方案2:手动指定ChromeDriver路径,绕过Selenium Manager
提前下载与本地Chrome浏览器版本匹配的chromedriver.exe,将其放置在脚本目录中,然后在代码中手动指定驱动路径,这样Selenium Manager就不会自动启动:
from subprocess import CREATE_NO_WINDOW from selenium.webdriver.chrome.service import Service from selenium.webdriver import Chrome, ChromeOptions def setup_options(options: ChromeOptions) -> ChromeOptions : options.add_argument('--headless=new') options.add_argument('--disable-extensions') options.add_argument('--disable-infobars') options.add_argument('--no-sandbox') return options def setup_driver() -> Chrome: # 手动指定chromedriver路径,替换为实际路径 service_chrome = Service(executable_path='./chromedriver.exe') service_chrome.creation_flags = CREATE_NO_WINDOW options = setup_options(ChromeOptions()) return Chrome(service=service_chrome, options=options) driver = setup_driver() # 执行自动化操作 driver.quit()
注意:打包时需将chromedriver.exe与生成的可执行文件放在同一目录下,且要保证chromedriver版本与目标机器上的Chrome版本匹配。
内容的提问来源于stack exchange,提问作者Sen ZmaKi
相关产品推荐
相关产品推荐

