我试图从一个python脚本构建exe来解决LP问题使用cvxpy和CBC (通过cylp)与pyinstaller。
代码如下:
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 64位
我的spec文件(由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)发布于 2021-12-16 16:06:41
根据文档,"--add-data“选项或"Analysis/datas”第一个字符串是“相对于等级库文件的位置。”
pyinstaller Read Doc Using Data File from a Module
我在Windows中使用了控制台行(双引号和分号分隔符)来添加cpp整个目录和版本文件(不需要任何其他内容)。
pyinstaller --添加数据"cylp\cpp;cylp\cpp“--添加数据”cylp\版本;cylp“LP.py
如果您想要"onefile“构建,请添加-F。
由于第一个字符串路径是相对路径,因此首先需要将整个cylp包站点文件夹从原始python目录复制到LP.py目录
PS:这是我在Stackoverflow中的第一个答案!
https://stackoverflow.com/questions/63589261
复制相似问题