我正在尝试从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 64位
我的规范文件(由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)
我遇到了同样的问题。我尝试了以下两个命令进行构建,结果相同:
但我还是犯了同样的错误。因为我正在用多个文件构建我的,所以我可以进入我的包/cyp/目录的dist/name\u,我可以看到cyp模块文件夹存在,但它在该目录中只有一个子文件夹cy。当我从构建中删除_my_package/cyp/cy/的dist/name_,并将我的cyp文件夹的内容直接从python虚拟环境复制到_my_package/cyp/的dist/name_时,我的exe工作。但只有在不使用onefile标志构建时,才能执行此操作
完成后,我看到以下文件夹结构:
pyinstaller构建的原始文件夹结构如下所示:
pyinstaller似乎知道获取cylp包,但它没有复制所有必需的部分。我不确定这里的真正答案是什么,但这个变通方法目前对我有效。希望有人能给我们指出正确的答案
相关问题 更多 >
编程相关推荐