Python py项目工作,但pyinstaller给出了与纸浆相关的错误

Python py项目工作,但pyinstaller给出了与纸浆相关的错误,python,python-3.x,optimization,pyinstaller,pulp,Python,Python 3.x,Optimization,Pyinstaller,Pulp,我在做一个关于纸浆线性优化的项目。当我通常“运行”该文件时,它工作得很好,但当我尝试使用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 Attribut

我在做一个关于纸浆线性优化的项目。当我通常“运行”该文件时,它工作得很好,但当我尝试使用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
回溯(最近一次呼叫最后一次):
文件“price.py”,第116行,在
文件“site packages\pulp\pulp.py”,第1713行,在solve中
AttributeError:“非类型”对象没有属性“actualSolve”
[9468]无法执行脚本价格
代码中我遇到问题的部分:

#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()
#问题类型
group\u division=纸浆.LpProblem(“group\u division”,纸浆.LpProblem)
#最小化目标函数
group_division+=目标函数(外部_组、内部_组)
#指定组的最大数目

group_division+=sum([x[group]表示外部_组中的组])当您使用python源中的纸浆时,该解算器可用,因为该解算器是唯一随纸浆一起提供的解算器。但当您运行pyinstaller时,它不再可用(因为您没有明确告诉pyinstaller复制它)

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

假设您有一个pyinstaller的
config.spec
文件,您必须将其编辑为如下内容(至少类似的内容适合我):

然后跑

pyinstaller -y config.spec

当您使用python源代码中的pulp时,该解算器可用,因为该解算器是唯一随pulp提供的解算器。但当您运行pyinstaller时,它不再可用(因为您没有明确告诉pyinstaller复制它)

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

假设您有一个pyinstaller的
config.spec
文件,您必须将其编辑为如下内容(至少类似的内容适合我):

然后跑

pyinstaller -y config.spec

执行失败,因为pyinstaller未安装pulp软件包。执行pyinstaller后,转到dist\your\u应用程序,您将看到您的\u应用程序包含除纸浆外的所有软件包

如果您正在虚拟环境中工作,请转到您的\u env\Lib\site包,复制所有与纸浆相关的文件,并将其粘贴到dist\u应用程序


如果您没有在虚拟环境中工作,请转到AppData\Local\Programs\Python\Python36\Lib\site packages并继续上面的操作。

执行失败,因为pyinstaller没有安装pulp package。执行pyinstaller后,转到dist\your\u应用程序,您将看到您的\u应用程序包含除纸浆外的所有软件包

如果您正在虚拟环境中工作,请转到您的\u env\Lib\site包,复制所有与纸浆相关的文件,并将其粘贴到dist\u应用程序

如果您不是在虚拟环境中工作,请转到AppData\Local\Programs\Python\Python36\Lib\site packages并执行上述操作

  • 这个问题是因为一旦运行pyinstaller,它就不会添加 纸浆所需的相关性与 所有其他包

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

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

  • 图书馆/网站包/纸浆

    我们需要将path作为附加参数传递给纸浆,如下所示:

    
    pyinstaller --noconfirm --onefile --console --add-data "C:/Users/.../Lib/site-packages/pulp;pulp/"  "C:/Users/.../python_to_exe.py"
    
    
    其中,第一个路径是用于纸浆目录,第二个路径是用于具有纸浆依赖性的python代码

  • 这个问题是因为一旦运行pyinstaller,它就不会添加 纸浆所需的相关性与 所有其他包

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

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

  • 图书馆/网站包/纸浆

    我们需要将path作为附加参数传递给纸浆,如下所示:

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

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

    您是否能够共享最少数量的代码来重现问题?看起来你最终得到了一个非类型的对象,在这里你应该有一个解算器对象。我猜是因为当从可执行文件运行时,无法看到解算器。当作为python代码运行时,您使用什么解算器?@kabdulla我使用spyder和JupyterLab运行代码,没有错误。我认为pyinstaller和Palm存在一些“通信”问题。您认为呢?据我所知,已在pyinstaller运行环境中找到了pulp库,但似乎找不到解算器(与pulp分离)。要检查id,建议运行(本地运行,然后通过pyinstaller gnerated exe)以下
    pulp.pulpTestAll()
    。然后您将知道从何处可以使用哪些解算器。Hmmm。。。以前,您只需按照此处的说明执行
    导入纸浆
    ,然后执行
    纸浆.palltestall()
    :您是否能够共享最少数量的代码来重现问题?看起来你最终得到了一个非类型的对象,在这里你应该有一个解算器对象。我猜是因为当从可执行文件运行时,无法看到解算器。当作为python代码运行时,您使用什么解算器?@kabdulla我使用spyder和JupyterLab运行代码,没有错误。我认为pyinstaller和Palm存在一些“通信”问题。你在想什么?从我所看到的来看,纸浆图书馆已经被关闭了