проект py работает, но pyinstaller выдает ошибку, связанную с целлюлозой - PullRequest
1 голос
/ 30 марта 2020

Я работаю над проектом по линейной оптимизации с целлюлозой. Когда я обычно "запускаю" файл, он работает хорошо, но у меня возникают некоторые проблемы, когда я пытаюсь преобразовать его в файл .exe с pyinstaller . Если я запускаю файл .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()

1 Ответ

1 голос
/ 22 апреля 2020

Решатель доступен, когда вы используете целлюлозу из своих python источников, потому что этот решатель является единственным, который поставляется с целлюлозой. Но когда вы запускаете pyinstaller, он больше не доступен (потому что вы явно не указываете pyinstaller копировать его).

При упаковке целлюлозы с помощью pyinstaller вы должны указать pyinstaller получить каталог с CB C решатель, который поставляется с мякотью тоже. Если нет, вы получите только код python, а затем ваша упакованная версия не найдет решатель CB C.

Если у вас есть файл config.spec для pyinstaller, вам нужно отредактировать его в что-то вроде следующего (по крайней мере, что-то вроде этого работает для меня):

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
...