Как собрать программу в один exe файл
Каждый новичок, изучающий пайтон сталкивается с проблемой упаковки своей программы в единый исполняемый файл.
Поскольку пайтон интерпретируемый язык программирования скомпилировать его в единый файл проблематично. Но не невозможно.
Для решения этой проблемы пайтон-разработчики идут на хитрость: в пакет программы "копируют" интерпретатор пайтон. Однако сделать это нужно правильно. И для этой цели обычно используют либо библиотеку pyinstaller , либо cx_freeze.
Pyinstaller позволяет упаковать программу чуть ли не в 2 клика. Однако если у вас есть дополнительные файлы, либо вы импортировали дополнительные библиотеки, скорее всего, pyinstaller не сможет их найти и у вас ничего не получится.
Поэтому я советую для сложных приложений использовать cx_freeze. И сразу скажу, все не так страшно, как может показаться. Мне удавалось запаковать игры с музыкой, картинками и все работало. Работаю я в Windows, а документацию библиотеки смотри здесь .
Шаг 1.Установка библиотеки cx_Freeze
Устанавливаем библиотеку cx_Freeze с помощью pip.
Вводим в командной строке:
Если появляется ошибка, то попробуйте добавить флаг --user.
Шаг 2. Напишем код, который запакует нашу программу.
В пакете нашей программы создаем файл с названием setup.py, в которую вписываем код, который запакует нашу программу. У меня была игра, и код компилятора выглядел так:
from cx_Freeze import setup, Executable
Шаг 3. Корректируем код
В третьей строке вписываем название файла, запускающего программу и название итогового файла exe.
Конвертировать иконку можно здесь .
В includes и zip_include_packages мы указываем те модули, которые мы использовали, чтобы python не забыл их запаковать.
В include_files мы указываем путь ко всем дополнительным файлам, которое использует наше приложение. Если у вас иерархия папок, а не все файлы скопом лежат в одной, то не забудьте в пути это указать.
В функции options ничего не исправляем.
В setup исправляем name - указываем имя главного файла, в version - версию приложения, а в description - описание приложения.
Ошибка с шрифтами
Шаг 3. Запаковываем.
Выполним запаковку, вбив в командную строку следующее:
У вас должен появиться файл build_windows. Это и есть наш итоговый пакет программы, который мы сможем распространять. Здесь же мы найдем файл .exe, запускающий нашу программу. Для него, например, можно создать ярлык и закинуть его на рабочий стол.
Возможные ошибки.
Если .exe файл выдает ошибку, то скорее всего, вы не указали, либо указали неправильно путь до одного из используемых файлов и программа не может его найти. Этот файл будет указан в ошибке.
Надеюсь у вас все получилось, а если нет, обязательно напишите об этом. И я постараюсь вам помочь.
Как собрать все файлы проекта в один exe?
есть работающий проект как скомпилировать его в 1 exe файл?
Как собрать все библиотеки в один exe-файл и уменьшить его?
Привет всем! Имеется проект на Python(Код самой программы, GUI и файл которой все объединяет -.
Как поместить все файлы в один exe?
К примеру есть программа, которая выводит картинку и звук). И выходит что сам exe при запуске.
Собрать все файлы в один
Здрям! Есть 700+ файлов. В каждом файле один лист, но листы называются как попало: лист1, list1.
Собрать все xml файлы в один и открыть в excel
Добрый день! Подскажите , Собрать все xml файлы в один , и можно ли этот файл открыть в excel в.
Как собрать несколько .exe в один?
Здравствуйте. Подсобите пожалуйста. У меня в решении 4 проекта, если их собирать, то получается 4-е.
Как объеденить файлы dll с exe ? Чтобы в итоге был только один exe файл
У меня есть 15 dll и 1 exe.Как их объеденить вместе?Чтобы получился только один EXEшник
Как собрать в один exe весь проект
всем привет, как собрать в один ехе весь проект на Дельфи? Добавлено через 1 минуту пжлста, мне.
Возможно ли собрать .exe и несколько .dll в один .exe?
Просто написал программку, получилось >6 .dll файлов, с этим ничего нельзя поделать без "отучения.
Как засунуть .exe, все .dll и шрифт в один .exe файл?
Я часа два пытался найти ответ на этот вопрос на русских и английских форумах, но ничего понятного.
Установка PyInstaller не отличается от установки любой другой библиотеки Python.
Вот так можно проверить версию PyInstaller.
Я использую PyInstaller версии 4.2.
Создание exe файла с помощью PyInstaller
PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:
- Считывает файл скрипта.
- Анализирует код для выявления всех зависимостей, необходимых для работы. spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
- Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
- Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
- Создает папку DIST в папке со скриптом, если она еще не существует.
- Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.
Если использовать параметр команды onedir или -D при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр onefile или -F , то все окажется в одном исполняемом файле.
Возьмем в качестве примера простейший скрипт на Python c названием simple.py, который содержит такой код.
Создадим один исполняемый файл. В командной строке введите:
После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.
Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.
Вот что произойдет после запуска файла.
Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.
Запустим файл simple1.exe, появится консоль с выводом: Всего фильмов: 7787 .
Добавление файлов с данными и параметр onefile
Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.
После успешного создания файл simple1.exe появится в папке DIST.
Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.
Дополнительные импорты с помощью Hidden Imports
Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку ImportError: No module named …
Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.
Например, чтобы добавить библиотеку os, нужно написать вот так:
Файл spec
Файл spec — это первый файл, который PyInstaller создает, чтобы закодировать содержимое скрипта Python вместе с параметрами, переданными при запуске.
PyInstaller считывает содержимое файла для создания исполняемого файла, определяя все, что может понадобиться для него.
Файл с расширением .spec сохраняется по умолчанию в текущей директории.
Если у вас есть какое-либо из нижеперечисленных требований, то вы можете изменить файл спецификации:
- Собрать в один бандл с исполняемым файлы данных.
- Включить другие исполняемые файлы: .dll или .so.
- С помощью библиотек собрать в один бандл несколько программы.
Например, есть скрипт simpleModel.py, который использует TensorFlow и выводит номер версии этой библиотеки.
Компилируем модель с помощью PyInstaller:
После успешной компиляции запускаем исполняемый файл, который возвращает следующую ошибку.
Исправим ее, обновив файл spec. Одно из решений — создать файл spec.
Команда pyi-makespec создает spec-файл по умолчанию, содержащий все параметры, которые можно указать в командной строке. Файл simpleModel.spec создается в текущей директории.
Поскольку был использован параметр --onefile , то внутри файла будет только раздел exe.
Если использовать параметр по умолчанию или onedir, то вместе с exe-разделом будет также и раздел collect.
Можно открыть simpleModel.spec и добавить следующий текст для создания хуков.
Создаем хуки и добавляем их в hidden imports и раздел данных.
Файлы хуков расширяют возможность PyInstaller обрабатывать такие требования, как необходимость включать дополнительные данные или импортировать динамические библиотеки.
Обычно пакеты Python используют нормальные методы для импорта своих зависимостей, но в отдельных случаях, как например TensorFlow, существует необходимость импорта динамических библиотек. PyInstaller не может найти все библиотеки, или же их может быть слишком много. В таком случае рекомендуется использовать вспомогательный инструмент для импорта из PyInstaller.utils.hooks и собрать все подмодули для библиотеки.
Скомпилируем модель после обновления файла simpleModel.spec.
Скопируем исполняемый файл на рабочий стол и увидим, что теперь он корректно отображает версию TensorFlow.
Вывод:
PyInstaller предлагает несколько вариантов создания простых и сложных исполняемых файлов из Python-скриптов:
Развертывание в одном файле доступно как для зависимой от платформы модели развертывания, так и для автономных приложений. Размер одного файла для автономного приложения будет большим, так как он будет включать в себя среду выполнения и библиотеки платформы. Вариант развертывания в виде одного файла можно сочетать с параметрами публикации ReadyToRun и Обрезка.
Развертывание в виде одного файла несовместимо с Windows 7.
Несовместимость API
Некоторые API несовместимы с моделью развертывания с одним файлом. Поэтому, возможно, потребуется изменить приложения, если они используют такие API. Если вы работаете со сторонними платформами или пакетами, возможно, они также используют один из таких API и требуют изменения. Распространенная причина многих проблем — это зависимость от путей к файлам или библиотекам DLL, поставляемых с приложением.
В таблице ниже приведены соответствующие сведения об API библиотеки среды выполнения для использования с одним файлом.
API | Примечание |
---|---|
Assembly.CodeBase | Выдает исключение PlatformNotSupportedException. |
Assembly.EscapedCodeBase | Выдает исключение PlatformNotSupportedException. |
Assembly.GetFile | Выдает исключение IOException. |
Assembly.GetFiles | Выдает исключение IOException. |
Assembly.Location | Возвращает пустую строку. |
AssemblyName.CodeBase | Возвращает null . |
AssemblyName.EscapedCodeBase | Возвращает null . |
Module.FullyQualifiedName | Возвращает строку со значением <Unknown> или вызывает исключение. |
Module.Name | Возвращает строку со значением <Unknown> . |
Вот некоторые рекомендации по исправлению для распространенных сценариев:
Чтобы получить доступ к файлам, расположенным рядом с исполняемым файлом, используйте AppContext.BaseDirectory.
Чтобы не допустить доставку свободных файлов в целом, используйте внедренные ресурсы.
Подключение отладчика
В Linux SOS с LLDB — это единственный отладчик, который может подключаться к автономным процессам с одним файлом или выполнять отладку аварийных дампов.
В Windows и Mac для отладки аварийных дампов можно использовать Visual Studio и VS Code. Для подключения к исполняемому файлу выполняемого автономного приложения с одним файлом требуется дополнительный файл: mscordbi. .
Чтобы устранить эти ошибки, нужно скопировать mscordbi и вставить рядом с исполняемым файлом. По умолчанию файл mscordbi обработан с помощью publish в подкаталоге с идентификатором среды выполнения приложения. Например, если бы нужно было опубликовать исполняемый файл автономного приложения с одним файлом, используя CLI dotnet для Windows и параметры -r win-x64 , файл следовало бы поместить в папку bin/Debug/net5.0/win-x64/publish. Копия mscordbi.dll будет находиться в папке bin/debug/NET 5.0/Win-x64.
Включение собственных библиотек
По умолчанию один файл не включает собственные библиотеки. В Linux предварительно связывается среда выполнения с пакетом, а в каталоге, в котором размещается приложение с одним файлом, развертываются только собственные библиотеки приложения. В Windows предварительно связывается только код размещения, а в каталоге, в котором размещается приложение с одним файлом, развертываются как библиотеки среды выполнения, так и собственные библиотеки приложения. Это позволяет обеспечить эффективную отладку, для которой требуется, чтобы собственные файлы были исключены из одного файла.
Можно задать флаг IncludeNativeLibrariesForSelfExtract , чтобы включить собственные библиотеки в один пакет, но эти файлы будут извлечены в каталог на клиентском компьютере при запуске приложения с одним файлом.
При извлечении файлы извлекаются на диск перед запуском приложения:
Чтобы предотвратить незаконное изменение, эти каталоги не должны быть доступны для записи для пользователей или служб с разными привилегиями (не /tmp или /var/tmp в большинстве систем Linux и macOS).
В некоторых средах Linux (например, в systemd) извлечение по умолчанию не будет работать, так как $HOME не определено. В таких случаях рекомендуется явно задать значение $DOTNET_BUNDLE_EXTRACT_BASE_DIR .
Другие замечания
Все связанные PDB-файлы будут храниться рядом с приложением с одним файлом, и они не будут упакованы по умолчанию. Если нужно включить PDB-файлы в сборку для компилируемых проектов, задайте для DebugType значение embedded , как описано ниже.
Исключить файлы из внедрения
Некоторые файлы можно явно исключить из внедрения в один файл, установив следующие метаданные.
Например, чтобы поместить некоторые файлы в каталог публикации, но не объединять их в один файл, укажите следующие параметры.
Добавление PDB-файлов в пакет
PDB-файл для сборки можно внедрить в саму сборку ( .dll ), используя параметр, приведенный ниже. Так как символы являются частью сборки, они также будут частью приложения с одним файлом:
Например, добавьте следующее свойство в файл проекта сборки, чтобы внедрить PDB-файл в эту сборку:
Сжатие сборок в приложении с одним файлом
Публикация приложения с одним файлом — пример файла проекта
Ниже приведен пример файла проекта, в котором задана публикация одного файла:
Эти свойства имеют следующие функции:
- PublishSingleFile — включение однофайловой публикации. Также включает однофайловые предупреждения во время dotnet build .
- SelfContained — определение того, будет ли приложение автономным или зависимым от платформы.
- RuntimeIdentifier — указание типа операционной системы и ЦП, для которых предназначено приложение. Также задает по <SelfContained>true</SelfContained> умолчанию.
- PublishReadyToRun — включение компиляции AOT.
Примечания.
Публикация приложения с одним файлом с помощью CLI
Опубликуйте приложение с одним файлом с помощью команды dotnet publish.
Добавьте <PublishSingleFile>true</PublishSingleFile> в файл проекта.
Это приведет к созданию однофайлового приложения при автономной публикации. При сборке также отображаются предупреждения о совместимости с одним файлом.
Опубликуйте приложение как для определенного идентификатора среды выполнения с помощью dotnet publish -r <RID>
В следующем примере приложение для Windows публикуется как автономное приложение с одним файлом.
dotnet publish -r win-x64
В следующем примере приложение для Linux публикуется как зависимое от платформы приложение с одним файлом.
dotnet publish -r linux-x64 --self-contained false
В файле проекта следует задать <PublishSingleFile> , чтобы включить анализ одного файла во время сборки, однако эти параметры также можно передать в качестве аргументов dotnet publish :
Публикация приложения с одним файлом с помощью Visual Studio
Visual Studio создает многократно используемые профили публикации, которые управляют процессом публикации приложения.
Добавьте <PublishSingleFile>true</PublishSingleFile> в файл проекта.
Если у вас еще нет профиля публикации, следуйте инструкциям по его созданию и выберите Папка в качестве типа целевого объекта.
В диалоговом окне Параметры профиля задайте следующие параметры.
- Параметру Режим развертывания задайте значение Автономное или Зависимое от платформы.
- В качестве значения параметра Целевая среда выполнения укажите платформу, на которую будет выполнена публикация. (Значение должно быть отличным от Переносимый.)
- Выберите Создать отдельный файл.
Чтобы опубликовать приложение с одним файлом, нажмите кнопку Опубликовать.
Публикация приложения с одним файлом с помощью Visual Studio для Mac
Читайте также: