Ошибка при попытке одновременно описать значок и пакеты в cx_Freeze - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь заморозить скрипт Python 3.7, используя pygame, в исполняемый файл (и создать установщик .msi), используя cx_Freeze с командой python setup.py bdist_msi , на моем * Компьютер 1037 * 10.

Я могу успешно собрать exe-файл с помощью cx_Freeze без указания значка, а также могу создать exe-файл из пустого python сценария, но с моим значком app_icon.ico. У этого второго exe-файла есть иконка, поэтому мой ico-файл кажется правильным. Но выполнение обоих одновременно (добавление опции icon=icon.ico в Executable(...) в cx_Freeze) приводит к быстрой ошибке после копирования некоторых библиотек в папку build \ exe.win-amd64-3.7 \:

running bdist_msi
running build
running build_exe
creating directory build\exe.win-amd64-3.7
copying c:\users\alexandre\anaconda3\lib\site-packages\cx_Freeze\bases\Console.exe -> build\exe.win-amd64-3.7\test.exe
copying c:\users\alexandre\anaconda3\api-ms-win-crt-stdio-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-stdio-l1-1-0.dll
copying c:\users\alexandre\anaconda3\python37.dll -> build\exe.win-amd64-3.7\python37.dll
copying c:\users\alexandre\anaconda3\VCRUNTIME140.dll -> build\exe.win-amd64-3.7\VCRUNTIME140.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-runtime-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-runtime-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-math-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-math-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-locale-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-locale-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-string-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-string-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-convert-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-convert-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-time-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-time-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-environment-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-environment-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-heap-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-heap-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-process-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-process-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-conio-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-conio-l1-1-0.dll
copying c:\users\alexandre\anaconda3\api-ms-win-crt-filesystem-l1-1-0.dll -> build\exe.win-amd64-3.7\api-ms-win-crt-filesystem-l1-1-0.dll
error: [WinError 2] Le fichier spcifi est introuvable: 'build\\exe.win-amd64-3.7\\test.exe'

Последняя строка на французском означает «Указанный файл не найден:».

Вот минимальный пример, который я придумал.

У меня есть папка Test \, содержащая значок app_icon .ico, пустой файл test.py и этот файл setup.py:

import cx_Freeze

cx_Freeze.setup(
    name="Test",
    options={"build_exe":
                {
                    "packages":["pygame"],
                    "include_files": ["app_icon.ico"],
                },
            },
    executables = [cx_Freeze.Executable(script="test.py",
                                        #icon="app_icon.ico"
                                    )
    ]
)

Обратите внимание, что попытка пропустить "packages":["pygame"] в файле setup.py при использовании модуля в файле test.py приведет к та же проблема (я думаю, что писать "packages":["pygame"] не нужно, поскольку cx_Freeze обнаружит pygame, если он используется).

Раскомментирование icon="app_icon.ico" вызывает ошибку, а затем комментирование "packages":["pygame"] удаляет ее.

В качестве последней, но озадачивающей детали: если я решу создать свой exe-файл (с моим полным полным python кодом для игры, но без иконки), я все равно могу сделать ярлык (вручную или с помощью опций *). 1025 *). У него будет иконка по умолчанию. Я могу изменить его с помощью правого клика (на ярлыке на рабочем столе), свойств, значка изменения. При щелчке на значке изменения всегда будет сообщаться

, следующий файл не найден:% APPDATA% \ Microsoft \ Installer {длинное шестнадцатеричное имя} ... \ app_icon.ico

Что странно, так как я ожидаю, что исполняемый файл будет искать свой значок в TargetDir или там, где он установлен, но не в папке% APPDATA% \ Microsoft \ Installer \. Я пытался установить папку exe в разные места, но всегда появляется одна и та же ошибка Microsoft \ Installer not found. И хотя я могу нажать «ок», чтобы закрыть это сообщение об ошибке, затем нажать «Обзор», чтобы вручную найти собственный файл ico. Если я в конечном итоге выберу иконку app_icon.ico, она будет принята и станет иконкой для ярлыка.

Прежде чем я закончу, моя проблема не имеет ничего общего с отсутствующими библиотеками mkl_ *, что является постоянной проблемой в темах SO, связанных с в cx_Freeze и Pygame. Я включил их в мое приложение без значков, которое прекрасно работает. Моя проблема на самом деле связана с иконкой, которая, кажется, имеет аллергию c на pygame.

1 Ответ

0 голосов
/ 15 апреля 2020

Я наконец решил эту проблему, добавив модули к ключу "excludes" аргумента cx_Freeze.setup() options и удалив несущественные mkl _ *. Dll в файле setup.py. Что-то там мешало между pygame и моей иконкой, и это даже не было необходимо в exe! ​​

Я пришел к этому решению, заметив, что наличие приложения объемом 1,1 ГБ, вероятно, слишком много, и я наверняка мог удалить некоторые из тяжелых модулей, импортированных cx_Freeze в папку. \ lib приложения. Мало того, что мое приложение теперь в 9 раз легче, но значок больше не приводит к сбою cx_Freeze.

Для дальнейшего использования мой файл setup.py теперь выглядит следующим образом:

import cx_Freeze
import os

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))

#this line was previously the list of all mkl_* dlls, plus libiomp5md.dll
mkl_dlls = ["mkl_intel_thread.dll", "mkl_core.dll", "libiomp5md.dll"]

cx_Freeze.setup(
    name="...",
    author= "...",
    description="...",
    options={"build_exe": {"packages":["os", "pygame"],
                            "excludes":["babel", "cryptography", "Cython", "distutils", "docutils", "IPython", "jedi", "llvmlite", "lxml", "markupsafe", "matplotlib", "mkl", "nbconvert", "numba", "numpy", "PIL", "prompt_toolkit", "psutil", "PyQt5", "pytest", "pytz", "scipy", "sphinx", "tkinter", "tornado", "win32com", "zmq"]+["libcrypto-1_1-x64.dll", "sqlite3.dll"],
                            "include_files":
                                ["app_icon.ico","other specific files to include"]+[os.path.join(PYTHON_INSTALL_DIR,"Library","bin",i) for i in mkl_dlls]
                        },
            },
    executables = [
            cx_Freeze.Executable(script="my main script.py",
                base="Win32GUI",
                targetName = "... .exe",
                icon="app_icon.ico",
                shortcutName = "...",
                shortcutDir = "DesktopFolder"
            ),
            cx_Freeze.Executable("my second script.py")
            ]
    )

# python setup.py build         to build the exe
# python setup.py bdist_msi     to create an msi
...