Сборка приложений Python в исполняемые файлы

Раздел: Инструменты -> Сборка приложений

Основные методы компиляции Python в EXE

Наиболее универсальным и активно поддерживаемым решением является PyInstaller. Он работает с Python 3.8+ и умеет собирать однопапочные и однофайловые исполняемые файлы для Windows, macOS и Linux.

Установка: pip install pyinstaller

Базовая сборка скрипта script.py в папку dist:

pyinstaller script.py

Python code compiler (компилятор python (превращение в exe))

Для сборки одного исполняемого файла (без дополнительных DLL) используется флаг --onefile:

pyinstaller --onefile script.py

Auto py to exe (конвертация python в exe (auto-py-to-exe))

Чтобы скрыть консольное окно (для GUI-приложений), добавляют --noconsole:

pyinstaller --onefile --noconsole script.py

как из кода python сделать приложение (упаковка python кода в приложение)

При необходимости включить в сборку дополнительные файлы (изображения, базы данных) применяют --add-data. Например, для включения папки data:

pyinstaller --add-data "data;data" --onefile script.py

Более тонкая настройка выполняется через файл спецификации (.spec), который генерируется при первом запуске.

Типичные проблемы и их решения:

  • Антивирусные ложные срабатывания. Исполняемые файлы, собранные PyInstaller, часто помечаются как вредоносные. Снизить риск помогает подпись кода сертификатом или использование Nuitka.
  • Отсутствие импортов. Если PyInstaller не видит некоторые библиотеки, укажите их явно через --hidden-import.
  • Ошибка пути к данным. После сборки пути к сопровождающим файлам меняются. В коде используйте sys._MEIPASS для однофайловых сборок.
  • Большой размер EXE. Используйте виртуальное окружение, устанавливайте только необходимые библиотеки. Также помогает сжатие UPX (флаг --upx-dir).

Как собрать EXE с минимальным количеством зависимостей?

Инструмент cx_Freeze позволяет точно указать, какие модули включать, и генерирует более компактные сборки по сравнению с PyInstaller. Установка: pip install cx-freeze

Пример файла setup.py:

from cx_Freeze import setup, Executable

setup(
    name="MyApp",
    version="1.0",
    description="My Application",
    executables=[Executable("script.py", base="Win32GUI")]
)

Запуск сборки: python setup.py build

Для управления включаемыми модулями в setup.py добавляют опции options:

options = {
    "build_exe": {
        "packages": ["os", "tkinter"],
        "includes": [],
        "excludes": ["numpy", "pandas"]
    }
}

Возможные трудности:

  • Сложная конфигурация для приложений с динамическими импортами (например, Flask).
  • Необходимость вручную указывать все зависимости, иначе на выходе получится битая сборка.
  • Проблемы с кодировками при сборке на Windows.

Как получить EXE с более высокой производительностью и защитой кода?

Nuitka транслирует Python в C++ и компилирует в нативный код, что улучшает скорость выполнения и усложняет декомпиляцию. Установка: pip install nuitka

Команда для сборки одного файла с консолью:

nuitka --standalone --onefile --output-dir=dist script.py

Для GUI-приложения без окна консоли:

nuitka --standalone --onefile --windows-disable-console --output-dir=dist script.py

Плагины подключаются через --enable-plugin, например для Tkinter:

nuitka --standalone --onefile --enable-plugin=tk-inter script.py

Ограничения:

  • Требуется установленный компилятор C++ (Microsoft Visual C++ на Windows, gcc на Linux).
  • Время компиляции значительно больше, чем у PyInstaller.
  • Не все библиотеки поддерживаются напрямую; для некоторых нужны плагины или ручные исправления.

Как собрать EXE без командной строки, через графический интерфейс?

Утилита auto-py-to-exe предоставляет веб-интерфейс на основе PyInstaller. Установка: pip install auto-py-to-exe, запуск: auto-py-to-exe. В браузере открывается форма, где можно выбрать скрипт, настроить флаги и запустить сборку.

Этот вариант удобен для начинающих или быстрой проверки. Все настройки соответствуют опциям PyInstaller.

При использовании auto-py-to-exe возможны те же проблемы, что и с PyInstaller, плюс сложности с обновлением самого инструмента и работой в окружениях с ограниченным доступом к браузеру.

Как кроссплатформенно собрать приложение для Windows, macOS и Linux?

BeeWare Briefcase позволяет упаковать Python-проект в нативные установщики для всех платформ из одной кодовой базы. Установка: pip install briefcase. Проект инициализируется командой:

briefcase new

После настройки файла pyproject.toml сборка для Windows выполняется так:

briefcase create
briefcase build
briefcase package

Основная сложность – требуется нативная среда разработки на каждой целевой платформе, а также дополнительные инструменты (например, WiX Toolset для Windows). Проект всё ещё находится в активной разработке, и не все библиотеки корректно упаковываются.

Расширенные примеры компиляции

PyInstaller: работа с иконками и версиями

Добавление иконки и информации о версии:

Пример
pyinstaller --onefile --noconsole --icon=icon.ico --version-file=version_info.txt script.py

Файл version_info.txt (пример):

Пример
# UTF-8
VSVersionInfo(
  ffi=FixedFileInfo(
    filevers=(1, 0, 0, 0),
    prodvers=(1, 0, 0, 0),
    mask=0x3f,
    flags=0x0,
    OS=0x40004,
    fileType=0x1,
    subtype=0x0,
    date=(0, 0)
  ),
  kids=[
    StringFileInfo(
      [
        StringTable(
          u'040904B0',
          [StringStruct(u'FileDescription', u'My Application'),
           StringStruct(u'ProductName', u'MyApp'),
           StringStruct(u'LegalCopyright', u'Copyright 2025')])
      ]),
    VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)

Результат: исполняемый файл с иконкой и свойствами в файловом менеджере.

PyInstaller: скрытие импортов и включение данных

Сборка Tkinter-приложения с папкой изображений:

Пример
pyinstaller --onefile --noconsole --add-data "images;images" --hidden-import=PIL._tkinter_finder gui_app.py

В коде приложения путь к данным получается так:

Пример
import sys, os, pathlib
if getattr(sys, 'frozen', False):
    base_path = sys._MEIPASS
else:
    base_path = pathlib.Path(__file__).parent
image_path = os.path.join(base_path, 'images', 'logo.png')
EXE успешно запускается, отображает логотип из упакованных файлов.

Nuitka: компиляция с оптимизациями

Команда с включением модуля multiprocessing и отключением консоли:

Пример
nuitka --standalone --onefile --windows-disable-console --enable-plugin=multiprocessing --plugin-option=multiprocessing:enable_fork=False script.py

Для больших проектов может потребоваться увеличить объём памяти компилятора:

Пример
nuitka --standalone --onefile --jobs=4 --clang script.py

Результат: скомпилированный EXE с улучшенной производительностью (особенно для вычислительных задач).

cx_Freeze: сборка PyQt-приложения

Пример конфигурации setup.py для приложения с PyQt5:

Пример
from cx_Freeze import setup, Executable
import sys

options = {
    'build_exe': {
        'packages': ['PyQt5', 'PyQt5.QtCore', 'PyQt5.QtGui', 'PyQt5.QtWidgets'],
        'include_files': ['data/', 'config.ini'],
        'excludes': ['tkinter', 'numpy']
    }
}

executables = [
    Executable('main.py', base='Win32GUI' if sys.platform == 'win32' else None, icon='app.ico')
]

setup(name='PyQtApp', version='1.0', options=options, executables=executables)

Сборка: python setup.py build_exe

В папке build появляется каталог с exe-файлом и необходимыми DLL.

auto-py-to-exe: настройка через веб-интерфейс

После запуска auto-py-to-exe откроется страница браузера. Пользователь выбирает скрипт, отмечает “One File”, “Console Window” (скрыть), указывает иконку. Дополнительно можно добавить скрытые импорты и дополнительные файлы в интерфейсе. Кнопка “Convert” запускает сборку PyInstaller с соответствующими флагами.

Готовый EXE появляется в указанной выходной папке.

Briefcase: упаковка в MSI установщик

После инициализации проекта и настройки pyproject.toml:

Пример
[tool.briefcase]
project_name = "MyApp"
bundle = "com.example"
version = "1.0"

[tool.briefcase.app.MyApp]
formal_name = "My Application"
icon = "icon.ico"
sources = ["src"]
requires = ["httpx"]

[tool.briefcase.platforms.windows]
# дополнительные настройки для Windows

Сборка MSI:

Пример
briefcase create windows
briefcase build windows
briefcase package windows
Создаётся установочный файл MyApp-1.0.msi, который можно распространять.

Компилятор Python (превращение в EXE) - comments

En
Python code compiler (python)