PyInstaller打包含OR-Tools CP-Sat的Python程序exe运行失败
问题描述
本地VS Code环境下运行程序时模型工作状态完全正常,使用PyInstaller将程序打包为exe后运行出现异常:仅弹出一个持续1秒的小窗口后就无任何后续响应,添加tk消息框测试也没有任何输出。
主程序导入语句如下:
import csv import os import openpyxl import sft_gen from ortools.sat.python import cp_model
自定义文件sft_gen的导入语句如下:
import csv from tkinter import Tk from tkinter.filedialog import askopenfilename
在cmd命令提示符中运行该exe时可查看报错信息,经逐一测试排查后确认:from ortools.sat.python import cp_model导入语句是导致exe无法正常执行的根本原因,需求为将开发完成的CP模型部署分发供其他用户使用。
解决方案
- 补充PyInstaller隐藏导入参数
PyInstaller默认无法自动抓取ortools库中部分动态加载的依赖,是导致导入失败的核心原因。打包时直接执行附加依赖声明的命令即可:
如果执行后仍提示ortools相关模块缺失,直接追加pyinstaller -F --hidden-import=ortools.sat.python.cp_model --hidden-import=ortools.init.python.init 主程序文件名.py--collect-all ortools参数,自动收集ortools库下所有子模块和依赖文件,命令如下:
由于程序用到tkinter组件,若打包后仍存在窗口闪退问题,可额外补充pyinstaller -F --collect-all ortools 主程序文件名.py--hidden-import=tkinter参数。 - 通过spec文件固定打包配置
若需要反复调整打包规则,可先生成spec配置文件,编辑文件中Analysis段的hiddenimports配置项,把缺失的ortools模块加入列表:
保存后执行a = Analysis( # 其余原有配置保持默认即可 hiddenimports=['ortools.sat.python.cp_model', 'ortools.init.python.init'], )pyinstaller 配置文件名.spec即可完成打包,无需每次输入长串命令参数。 - 更换其他打包工具验证
若PyInstaller调整后仍存在兼容问题,可尝试Nuitka、py2exe等其他打包工具。以Nuitka为例,打包时需要显式声明包含ortools包、启用tkinter插件,参考命令:nuitka --standalone --onefile --enable-plugin=tk-inter --include-package=ortools 主程序文件名.py - 调试注意事项
每次打包完成后不要直接双击运行exe,先打开cmd进入exe所在目录,通过命令行启动exe,可直接看到完整的报错输出,快速定位剩余缺失的依赖项。
内容的提问来源于stack exchange,提问作者SixtyCorrupted
相关产品推荐
相关产品推荐

