我试图从一个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-02-17 06:46:33
我也遇到了同样的问题。我已经尝试了以下两个命令来构建,结果是相同的:
pyinstaller name_of_my_package.py
pyinstaller --hidden-imports=cylp name_of_my_package.py但我仍然得到相同的错误。因为我是用多个文件构建我的,所以我可以进入dist/name_of_my_package/ cylp /目录,我可以看到cylp模块文件夹存在,但它在该目录中只有一个cy子文件夹。当我从构建中删除dist/name_ of _ my _package/ cylp / cylp/,并将cylp文件夹的内容直接从python虚拟环境复制到dist/name_of_ my _package/cylp/时,我的exe就可以工作了。但是,只有在构建时没有使用--onefile标志时,才能这样做。
完成后,我看到了以下文件夹结构:
dist/name_of_my_package/cylp/
|--cpp/
|--<a bunch of stuff in here>
|--cy/
|--<a bunch of stuff in here>
|--py
|--<a bunch of stuff in here>
|--__init__.py
|--VERSIONpyinstaller构建的原始文件夹结构仅如下所示:
dist/name_of_my_package/cylp/
|--cy/
|--<a bunch of stuff in here>看起来pyinstaller知道要获取cylp包,但它没有复制所有必需的部分。我不确定真正的答案是什么,但这个变通方法目前对我有效。希望有人能给我们指出正确的答案。
发布于 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
复制相似问题