Сборка приложений Python в исполняемые файлы
Основные методы компиляции Python в EXE
Наиболее универсальным и активно поддерживаемым решением является PyInstaller. Он работает с Python 3.8+ и умеет собирать однопапочные и однофайловые исполняемые файлы для Windows, macOS и Linux.
Установка: pip install pyinstaller
Базовая сборка скрипта script.py в папку dist:
pyinstaller script.pyPython code compiler (компилятор python (превращение в exe))
Для сборки одного исполняемого файла (без дополнительных DLL) используется флаг --onefile:
pyinstaller --onefile script.pyAuto 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, который можно распространять.