如何使用 Pyinstaller 将包含 Pyomo、GLPK、IPOPT 的 Python 脚本转换为单个 exe 应用程序

How to convert a Python Script constains Pyomo, GLPK, IPOPT to single exe app with Pyinstaller

我正在尝试构建一个解决线性规划问题的程序。我决定使用 pyomo 作为包,使用 glpk 和 ipopt 作为优化器。我需要将我的 Python 脚本转换为单个 exe 文件。我使用了 Pyinstaller 但出现错误

pyomo.common.errors.ApplicationError: No executable found for solver 'ipopt'

如何将 glpk 和 ipopt 求解器与我的 Python 脚本一起包含到单个 exe 文件中。

谢谢

我还没有为单个 exe 应用程序尝试过,但是对于 PyInstaller 的一个目录模式有一个可行的解决方案。

  1. 首先,您应该在 pyomo 优化设置中指定求解器可执行文件的路径

    opt = pyomo.SolverFactory('ipopt', executable='ipopt.exe')

对于这种情况,pyomo 将在您的当前目录中寻找求解器可执行文件,并运行您的 Python 脚本。

  1. 其次,您可以在PyInstaller开始编译您的脚本。

  2. 编译完成后,将求解器可执行文件粘贴到包含 .exe 文件的目录中。

如果您要将代码编译成单个 .exe 文件,您可以重复该步骤并将脚本编译成单个 .exe。它应该与放置在您的单个应用程序文件的同一目录中的求解器可执行文件一起使用。

但是,如果您要将代码编译成单个 .exe 文件而没有任何其他辅助文件,您可以尝试使用包含 PyInstaller 设置的 .spec 文件。如果你有那个文件,它可能看起来像

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['your_script.py'],
             pathex=['path_to_your_script'],
             binaries=[],
             datas=[('vcomp140.dll', '.')],
             hiddenimports=['pkg_resources.py2_warn','pyomo.common.plugins','pyomo.repn.util',
                            'pyomo.opt.plugins',
                            'pyomo.core.plugins',
                            'pyomo.dataportal.plugins',
                            'pyomo.duality.plugins',
                            'pyomo.checker.plugins',
                            'pyomo.repn.plugins',
                            'pyomo.pysp.plugins',
                            'pyomo.neos.plugins',
                            'pyomo.solvers.plugins',
                            'pyomo.gdp.plugins',
                            'pyomo.mpec.plugins',
                            'pyomo.dae.plugins',
                            'pyomo.bilevel.plugins',
                            'pyomo.scripting.plugins',
                            'pyomo.network.plugins',
                            'pandas._libs.skiplist'
             ],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='your_script',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='your_script')

因此,您可以尝试通过 Analysis

中的 data 参数将求解器可执行文件添加到 PyInstaller 导入中