PyInstaller配合UPX压缩exe提示Failed to execute script如何解决
问题原因分析
该报错核心是UPX对OpenCV相关的DLL文件压缩时存在兼容性问题,部分带有数字签名、特殊段结构的DLL被UPX压缩后会出现内存映射异常,导致加载失败。不使用UPX时程序可正常运行,已经排除代码本身、PyInstaller基础打包逻辑的问题,问题完全出在UPX对特定DLL的压缩环节。
排查步骤
- 首先找到PyInstaller打包时生成的build临时目录,或者dist输出目录里的cv2相关文件,常见易出问题的文件包括
opencv_worldxxx.dll、opencv_videoio_ffmpegxxx.dll、cv2扩展文件cv2.cp3x-win_amd64.pyd - 先将这类文件从UPX压缩列表中排除后重新打包测试,若可正常运行即可确认是这些文件的兼容性问题
- 若依然报错,可逐个排除其他第三方库的DLL、pyd文件,直到定位到导致异常的压缩对象
具体解决方案
方案1:打包时指定UPX排除规则(兼容性最好,无需修改工具版本)
PyInstaller原生支持配置UPX排除文件列表,打包时追加--upx-exclude参数即可,示例命令如下:
pyinstaller -F -w --upx-dir "你的UPX本地目录路径" --upx-exclude "opencv_world*.dll" --upx-exclude "opencv_videoio_ffmpeg*.dll" --upx-exclude "cv2.*.pyd" main.py
如果使用spec文件打包,直接在EXE配置段添加upx_exclude=['opencv_world*.dll', 'opencv_videoio_ffmpeg*.dll', 'cv2.*.pyd']即可。
方案2:更换UPX版本
部分老旧版本、测试版UPX对Windows平台DLL的压缩兼容性较差,可尝试更换为UPX 3.96稳定版,测试是否可以正常压缩所有文件无异常。
方案3:仅压缩主程序文件
如果嫌排查排除文件麻烦,可以先不加UPX参数完成打包,之后单独对dist目录下的主程序main.exe执行UPX压缩,其他依赖的DLL、pyd文件保持原状态,既可以缩减主程序体积,也能避免依赖文件压缩出错。
额外注意事项
- 代码中涉及的powershell调用、注册表写入、公共目录复制等操作属于敏感行为,部分杀毒软件会将UPX压缩后的程序判定为恶意程序,运行被拦截时可临时关闭实时防护测试,或给程序添加数字签名。
- 不要使用UPX的极端压缩参数
--ultra-brute,该参数输出的文件兼容性极差,极易出现运行异常。
内容的提问来源于stack exchange,提问作者robotmr
相关产品推荐
相关产品推荐

