首页 > 解决方案 > 如何使用 Pyinstaller 将包含 Pyomo、GLPK、IPOPT 的 Python 脚本转换为单个 exe 应用程序

问题描述

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

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

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

谢谢

标签: pythonpyinstallerpyomoglpkipopt

解决方案


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

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

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

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

  1. 其次,您可以通过PyInstaller.

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

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

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

# -*- 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')

因此,您可以尝试将求解器可执行文件通过data参数添加到 PyInstaller 导入中Analysis


推荐阅读