PyInstaller打包Python脚本为exe后,ChromeDriverManager下载失效
问题解决:PyInstaller打包Selenium脚本后exe运行报错AttributeError
错误原因
你使用--windowed参数打包时,程序运行会隐藏控制台窗口,但webdriver-manager依赖的tqdm库需要向标准输出打印下载进度条,此时标准输出对象为None,因此触发了'NoneType' object has no attribute 'write'错误。
解决方案
方案1:移除--windowed参数,保留控制台
修改打包命令,去掉--windowed参数:
PyInstaller --onefile --icon="icon.ico" --add-data "icon.ico;." myscript.py
运行生成的exe时会弹出控制台,tqdm能正常输出进度,程序即可正常执行。
方案2:禁用webdriver-manager的进度条输出
如果必须保留无窗口模式,可在代码开头添加环境变量禁用进度条:
import os os.environ['WDM_PROGRESS_BAR'] = '0'
或者在初始化ChromeDriverManager时设置日志级别关闭输出:
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(log_level=0).install()), options=options)
方案3:手动指定ChromeDriver路径,跳过自动下载
- 预先下载与你的Chrome版本匹配的ChromeDriver,放到脚本目录。
- 修改打包命令,将ChromeDriver加入打包资源:
PyInstaller --onefile --windowed --icon="icon.ico" --add-data "icon.ico;." --add-data "chromedriver.exe;." myscript.py
- 修改代码,适配打包后的资源路径:
import sys import os def resource_path(relative_path): # 获取打包后资源的实际路径 base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) driver_path = resource_path("chromedriver.exe") driver = webdriver.Chrome(service=ChromeService(driver_path), options=options)
内容的提问来源于stack exchange,提问作者manuel
相关产品推荐
相关产品推荐

