PyInstaller 打包后找不到 Selenium 的 Chrome WebDriver 模块怎么办?
可以先用 --hidden-import=selenium.webdriver.chrome.webdriver 显式收集报错中的模块,重新打包后再验证。从 traceback 看,Selenium 的部分代码已经进入运行流程。优先检查动态导入的子模块是否漏打包,并确认打包环境与 PyCharm 使用的环境一致。
现有信息不足以判断是否存在版本兼容性问题。补充这一个模块,也未必能解决所有依赖问题。
为什么 IDE 中正常,EXE 却缺少模块?
PyCharm 运行程序时,可以直接访问当前 Python 环境中安装的包;打包后的程序依赖 PyInstaller 收集进去的模块。
traceback 中出现了 __getattr__ 和 import_module,说明报错发生在运行时动态导入过程中。PyInstaller 的分析可能漏掉了这条依赖,需要检查隐藏导入。
缺失的是 Python 模块 selenium.webdriver.chrome.webdriver。不能仅凭这条报错认定 chromedriver.exe 缺失,暂时不必修改驱动路径。
1. 确认使用了相同的 Python 环境
在用于打包的终端中执行:
python -c "import sys; print(sys.executable)"
python -m pip show selenium pyinstaller
python -c "import selenium.webdriver.chrome.webdriver as m; print(m.__file__)"
将输出的 Python 路径与 PyCharm 项目配置的解释器路径对照。如果不一致,先切换到对应环境,再运行打包命令。
如果最后一条命令也报 ModuleNotFoundError,先修复该环境中的 Selenium 安装,直到能直接导入这个模块。打包环境中不存在的模块,即使增加打包参数也无法收集。
2. 添加隐藏导入并保留控制台
确认模块可以直接导入后,执行:
python -m PyInstaller --clean --onefile --console --hidden-import=selenium.webdriver.chrome.webdriver main.py
使用 python -m PyInstaller 可以明确让打包过程使用当前 python 对应的环境。--hidden-import 用于补充模块依赖,--clean 用于清理打包缓存。
排查时先使用 --console,方便查看完整异常。构建完成后,在终端运行新生成的文件:
.\dist\main.exe
确认运行的是本次生成的 EXE。
3. 如果继续缺少 Selenium 子模块
如果补充上述模块后,又报另一个 Selenium 子模块缺失,可以尝试扩大收集范围:
python -m PyInstaller --clean --onefile --console --collect-submodules=selenium main.py
--collect-submodules=selenium 会收集 Selenium 的子模块,适合排查连续出现的模块遗漏,但可能增加打包体积。
这个参数针对 Python 模块,不代表浏览器、驱动程序或其他外部文件也已全部包含。如果后续出现驱动定位或浏览器启动失败的异常,需要根据新报错继续处理。
4. 验证成功后再隐藏控制台
确认程序能够启动并完成实际浏览器操作后,再将有效打包命令中的 --console 替换为 --noconsole。
原问题没有提供 Python、Selenium 和 PyInstaller 的具体版本。如果补充依赖后仍然失败,应保留这些版本信息和新的完整 traceback,再判断是否需要调整版本或打包配置。
备注:内容仅供参考。
