我正在尝试从 python 脚本构建 exe,以使用 cvxpy 和 CBC(通过 cylp)和 pyinstaller 来解决 LP 问题。
代码是这样的:
import numpy as np
import cvxpy as cp
if __name__ == "__main__":
A = np.array([[2, 0, 0],
[1, 0, 2],
[0, 3, 1]])
b = np.array([4, 8, 6])
c = np.array([3, 4, 2])
# Define and solve the problem.
x = cp.Variable(3)
prob = cp.Problem(cp.Maximize(c.T @ x),
[A @ x <= b, x >= 0])
prob.solve(solver=cp.CBC)
print(f"solver: {prob.solver_stats.solver_name}")
# Print result.
print("The optimal value is", prob.value)
print("A solution x is")
print(x.value)
这适用于 python 解释器
> python .\LP.py
solver: CBC
The optimal value is 16.0
A solution x is
[2. 1. 3.]
但是pyinstaller制作的exe会抛出错误
> pyinstaller .\LP.spec
> .\dist\LP.exe
Traceback (most recent call last):
File "LP.py", line 15, in <module>
prob.solve(solver=cp.CBC)
File "cvxpy\problems\problem.py", line 396, in solve
File "cvxpy\problems\problem.py", line 745, in _solve
File "cvxpy\problems\problem.py", line 500, in get_problem_data
File "cvxpy\problems\problem.py", line 651, in _construct_chain
File "cvxpy\problems\problem.py", line 576, in _find_candidate_solvers
cvxpy.error.SolverError: The solver CBC is not installed.
[18960] Failed to execute script LP
有没有办法来解决这个问题?
我无法避免使用 CBC,因为我真正想做的是制作一个解决混合整数编程问题的 exe。
我的环境:
numpy:1.19.1
cvxpy:1.1.4
cylp:0.91.0
PyInstaller:4.0
Python:3.7.9
平台:Windows 10 v1909 64bit
我的规范文件(由pyinstaller .\LP.py -F
我修改datas
):
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['LP.py'],
pathex=['C:\\Users\\aaa\\Desktop\\LP'],
binaries=[],
datas=[
('C:\\Users\\aaa\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\site-packages\\cylp\\*',
'.\\cylp\\')],
hiddenimports=[],
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='LP',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True)