如何将含Pyomo、GLPK、IPOPT的Python脚本用Pyinstaller打包为单exe文件
打包Pyomo求解器的操作步骤
前置准备
- 提前获取对应位数(和你打包用的Python版本32/64位一致)的GLPK、IPOPT Windows可执行文件,即
glpsol.exe和ipopt.exe,在本地运行确认没有依赖缺失(比如IPOPT需要的VC++运行库提前安装好)
修改Pyomo求解器调用代码
你需要在代码中动态适配开发环境和打包后运行环境的求解器路径,Pyinstaller打包后的程序运行时会将资源释放到临时目录,可通过sys._MEIPASS获取该目录路径,示例代码如下:
import sys import os from pyomo.environ import SolverFactory def fetch_solver_executable(solver_filename): # 判断是否为打包后的运行状态 if getattr(sys, 'frozen', False): resource_root = sys._MEIPASS else: # 开发环境下替换为你本地存放求解器exe的目录 resource_root = os.path.dirname(os.path.abspath(__file__)) return os.path.join(resource_root, solver_filename) # 初始化求解器时显式指定可执行文件路径 ipopt_solver = SolverFactory('ipopt', executable=fetch_solver_executable('ipopt.exe')) glpk_solver = SolverFactory('glpk', executable=fetch_solver_executable('glpsol.exe'))
执行打包命令
使用--add-binary参数将两个求解器exe作为资源打包进单文件exe,Windows系统下的命令格式如下,替换路径和脚本名为你自己的即可:pyinstaller -F --add-binary "C:/你的本地路径/ipopt.exe;." --add-binary "C:/你的本地路径/glpsol.exe;." 你的脚本名.py
命令中;后的.表示资源文件在打包后会被放到临时目录的根路径,和上一步代码的路径逻辑匹配。
异常排查
如果打包后运行仍提示找不到求解器,可按以下方向检查:
- 运行exe时,打开系统临时目录(路径为
%TEMP%),查找名称为_MEIXXXX(XXXX为随机数字)的临时文件夹,确认两个求解器exe是否被正常释放到该目录下 - 确认求解器exe的位数和Python环境、操作系统位数匹配,没有依赖缺失问题
内容的提问来源于stack exchange,提问作者firattamur
相关产品推荐
相关产品推荐

