【问题标题】:py project works but pyinstaller gives error related to pulppy 项目有效,但 pyinstaller 给出了与纸浆相关的错误
【发布时间】:2020-07-10 14:32:12
【问题描述】:

我正在开展一个使用纸浆进行线性优化的项目。当我通常“运行”该文件时,它运行良好,但是当我尝试使用 pyinstaller 将其转换为 .exe 文件时遇到了一些问题。 如果我从命令提示符运行 .exe 文件,则会报告错误:

Traceback (most recent call last):
  File "price.py", line 116, in <module>
  File "site-packages\pulp\pulp.py", line 1713, in solve
AttributeError: 'NoneType' object has no attribute 'actualSolve'
[9468] Failed to execute script price

我遇到问题的代码部分:

#type of problem
group_division = pulp.LpProblem("Group_division", pulp.LpMinimize)

#objective function to minimize
group_division += objectiveFunction(external_groups, internal_groups)

#specify the maximum number of groups
group_division += sum([x[group] for group in external_groups]) <= max_groups,                             
"Maximum_number_of_groups"

#every thickness must appear once 
for cutType in cutTypes:
group_division += oneCutConstraint(x, y, external_groups, internal_groups, cutType) == 
1,"Must_appear_%s"%cutType

#solve the problem    
group_division.solve()

【问题讨论】:

  • 您能否分享最少的代码来重现问题?看起来你最终得到了一个 NoneType 对象,你应该有一个求解器对象。我猜是因为当你从可执行的纸浆中运行时看不到求解器。作为 python 代码运行时,您使用什么求解器?
  • @kabdulla 我用 spyder 和 JupyterLab 运行代码,我没有错误。我认为 pyinstaller 和纸浆有一些“沟通”问题。你怎么看?
  • 据我所见,pyinstaller 运行环境中找到了纸浆库,但似乎找不到求解器(与纸浆分开)。
  • 检查 id 建议运行(本地然后通过 pyinstaller-gnerated exe)以下pulp.pulpTestAll()。然后,您将知道从哪里可以使用哪些求解器。
  • 嗯...过去你可以按照此处的说明执行import pulp,然后是pulp.pulpTestAll()coin-or.org/PuLP/main/…

标签: python python-3.x optimization pyinstaller pulp


【解决方案1】:

当您使用 python 源中的纸浆时,该求解器可用,因为该求解器是纸浆附带的唯一求解器。但是当您运行 pyinstaller 时,它不再可用(因为您没有明确告诉 pyinstaller 复制它)。

当使用 pyinstaller 打包纸浆时,您需要告诉 pyinstaller 获取包含纸浆附带的 CBC 求解器的目录。如果没有,你只会得到 python 代码,然后你的打包版本将找不到 CBC 求解器。

假设您有一个用于 pyinstaller 的 config.spec 文件,您必须将其编辑为如下内容(至少这样的内容对我有用):

import sys
import os

block_cipher = None

def get_pulp_path():
    import pulp
    return pulp.__path__[0]

path_main = os.path.dirname(os.path.abspath(sys.argv[2]))

a = Analysis(['MAIN_SCRIPT.py'],
             pathex=[path_main],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

a.datas += Tree(get_pulp_path(), prefix='pulp', excludes=["*.pyc"])

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(pyz, a.scripts, exclude_binaries=True, name='NAME', debug=False, strip=False, upx=True, console=True)
coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='NAME')

然后运行

pyinstaller -y config.spec

【讨论】:

    【解决方案2】:

    执行失败,因为 pyinstaller 没有安装纸浆包。执行完pyinstaller后,进入dist\your_app,你会看到your_app包含了除了pull以外的所有包。

    如果你是在虚拟环境下工作,请到 your_env\Lib\site-packages 并复制所有与纸浆相关的文件并将其粘贴到 dist\your_app

    如果您不在虚拟环境中工作,请转到 AppData\Local\Programs\Python\Python36\Lib\site-packages 并按照上述步骤进行操作。

    【讨论】:

      【解决方案3】:
      1. 这个问题是因为一旦你运行 pyinstaller,它就不会添加 与纸浆的依赖相比,纸浆所需的依赖 所有其他软件包。

      2. 需要明确指定纸浆文件夹的路径。这 文件夹可以在python环境所在的目录下找到 已安装。

      3. 纸浆文件夹的路径可以在python路径中找到

      Lib/site-packages/纸浆

      我们需要传递纸浆的路径作为附加参数,如下所示:

      
      pyinstaller --noconfirm --onefile --console --add-data "C:/Users/.../Lib/site-packages/pulp;pulp/"  "C:/Users/.../python_to_exe.py"
      
      

      第一个路径是纸浆目录,第二个是具有纸浆依赖的python代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多