PyInstaller打包exe跨设备运行报Failed to execute script错误
这是PyInstaller打包Selenium类项目的高频踩坑点。你自己电脑能正常运行,是因为本地已经装全了Python环境、浏览器驱动、相关依赖库,路径和环境变量都配置完整;而PyInstaller默认不会自动识别Selenium、selenium-wire的动态加载资源和隐式依赖,这些内容没被打包进exe,其他电脑没有匹配的本地环境,就会直接抛出「Failed to execute script WS.py」的通用错误,和你用不用虚拟环境打包没有直接关系。
第一步:显式指定所有隐式依赖,别让PyInstaller自动扫描猜依赖
不要直接用最简打包命令,先把selenium、selenium-wire及其关联的动态导入库全部加到隐藏导入参数里,基础打包命令参考如下:pyinstaller -D --hidden-import=selenium --hidden-import=seleniumwire --hidden-import=selenium.webdriver --hidden-import=selenium.webdriver.chrome.service --hidden-import=selenium.webdriver.chrome.options --hidden-import=blinker --hidden-import=h11 --hidden-import=h2 --hidden-import=certifi --hidden-import=OpenSSL WS.py注:selenium-wire依赖的blinker、h11、h2、certifi、OpenSSL都是动态加载的,PyInstaller默认扫描不到,不手动加就会漏依赖。
第二步:解决浏览器驱动适配问题
不要用Selenium默认的自动下载驱动逻辑,这个逻辑在其他电脑上大概率失败:要么没网拉取驱动,要么权限不足写不了缓存目录,要么对方电脑浏览器版本和驱动不匹配。正确操作如下:- 下载和Chrome大版本匹配的
chromedriver.exe,放到WS.py同目录下 - 修改代码里的驱动初始化逻辑,写死相对路径,保证开发环境和打包后的exe环境都能正确找到驱动:
import sys import os from selenium import webdriver from selenium.webdriver.chrome.service import Service # 自动识别当前运行环境的基础路径 if getattr(sys, 'frozen', False): base_path = os.path.dirname(sys.executable) else: base_path = os.path.dirname(os.path.abspath(__file__)) driver_path = os.path.join(base_path, 'chromedriver.exe') service = Service(driver_path) driver = webdriver.Chrome(service=service)- 打包命令追加附加二进制参数
--add-binary "chromedriver.exe;.",保证驱动会被打包到对应路径。
- 下载和Chrome大版本匹配的
第三步:补全selenium-wire的证书文件
selenium-wire默认自带根证书用于HTTPS抓包,这两个证书文件PyInstaller完全识别不到,漏了就会直接启动崩溃:- 打开你的虚拟环境目录,找到
Lib/site-packages/seleniumwire/cert/路径,把里面的ca.crt和ca.key两个文件复制出来,在WS.py同目录新建cert文件夹,把两个证书放进去 - 打包命令追加附加资源参数
--add-data "cert/*;seleniumwire/cert/",让打包后的程序能在对应路径找到证书。
- 打开你的虚拟环境目录,找到
第四步:补全系统运行库
如果对方电脑是纯净版Windows,没装VC++ 2015-2022版本的运行库,也会触发这类报错,安装对应版本的x86/x64 VC++运行库即可解决。
你现在看到的是PyInstaller关闭控制台后抛出的通用错误提示,看不到具体报错原因。打包时暂时去掉-w(无控制台)参数,打包出带控制台窗口的版本,在其他电脑运行时,控制台会直接打印具体缺失的模块、文件路径,照着缺的内容补就行,不用盲目试错。
注意事项:
- 不要单独把exe文件从dist目录拽出来发送,用
-D模式打包后,要把dist目录下和exe同名的整个文件夹压缩后发送,保证所有依赖文件和exe在同一目录层级- 新手不要强行用
-F参数打单文件exe,单文件模式每次运行都会把资源解压到系统临时目录,很容易被安全软件误删导致报错,稳定性远低于文件夹模式- 如果对方电脑安装了360、腾讯电脑管家这类安全软件,第一次运行时要允许exe的所有操作,避免安全软件拦截驱动、证书文件导致运行失败
内容的提问来源于stack exchange,提问作者Wet Sockys

