Исполняемые программы на Python: от скрипта к готовому приложению
Инструменты и методы создания исполняемых файлов
Преобразование скрипта Python в автономную исполняемую программу решает задачу распространения приложений без необходимости устанавливать интерпретатор и зависимости. Ниже рассмотрены основные подходы с примерами кода и типичными затруднениями.
Каким образом из скрипта Python получить одиночный exe файл, работающий на компьютерах без Python?
Наиболее эффективным инструментом считается PyInstaller. Он анализирует импорты, упаковывает интерпретатор и библиотеки в один или несколько файлов. Установка и базовая сборка выглядят так:
pip install pyinstaller
pyinstaller --onefile --windowed --icon=app.ico myscript.pyPython исполняемая программа (исполняемая программа python)
Параметр --onefile создает единственный исполняемый файл, --windowed убирает консоль (для GUI приложений), --icon задает иконку. Результат появляется в папке dist.
Возможные проблемы:
- Ложные срабатывания антивирусов - упакованные скрипты часто распознаются как угрозы. Решение: добавить подпись, использовать UPX сжатие (--upx-dir) или исключить неиспользуемые модули (--exclude-module).
- Ошибка ModuleNotFoundError для динамически импортируемых библиотек - требуется явно указать скрытые импорты: --hidden-import=numpy.
- Большой размер (50+ МБ) - уменьшается с помощью --exclude-module и опции --onefile (потому что распаковка не требуется).
Как собрать исполняемый файл с сохранением папок зависимостей и данных?
Инструмент cx_Freeze создает папку со всеми файлами, а не одиночный exe. Пример конфигурации через setup.py:
from cx_Freeze import setup, Executable
setup(
name='MyApp',
version='1.0',
executables=[Executable('script.py', base='Win32GUI')]
)
Затем выполняется сборка: python setup.py build. Полученная папка содержит все необходимые DLL и библиотеки. Это удобно для приложений, которым требуются ресурсы (изображения, конфиги).
Типичная ошибка: отсутствие некоторых модулей в сборке. Решение: добавить их в options через build_exe.includes или include_files.
Каким образом получить скомпилированный бинарник с повышенной производительностью?
Nuitka транслирует Python в C/C++ и компилирует нативный код. Команда:
nuitka --standalone --onefile --enable-plugin=tk-inter script.py
Параметр --standalone упаковывает все зависимости, --onefile создает один exe, --enable-plugin=tk-inter подключает поддержку Tkinter. Результат - компактный исполняемый файл.
Сложности: длительное время компиляции (особенно для больших проектов) и возможные ошибки при наличии C-расширений. Рекомендуется тестировать на целевой ОС.
Как создать exe с минимальными усилиями без установки дополнительных инструментов?
py2exe (устарел, не поддерживает Python 3.10+) требует написания setup.py:
from distutils.core import setup
import py2exe
setup(console=['script.py'])
Запуск: python setup.py py2exe. Современные проекты использовать не рекомендуется из-за отсутствия обновлений.
Как упаковать скрипт через графический интерфейс, не прибегая к командной строке?
auto-py-to-exe служит графической оболочкой над PyInstaller. Установка: pip install auto-py-to-exe. Запуск: auto-py-to-exe. В окне выбирается скрипт, настройки (onefile, windowed, иконка) и нажимается кнопка “Convert”. Под капотом вызывается PyInstaller с соответствующими аргументами.
Ограничение: меньше контроля над деталями сборки (например, сложные spec-файлы не поддерживаются).
Дополнительные примеры и углубленные настройки
Пример 1: PyInstaller с кастомным .spec файлом для сложных проектов
Создается файл myscript.spec с полным контролем:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['myscript.py'],
pathex=['C:\\project'],
binaries=[],
datas=[('config.json', 'config'), ('images/*.png', 'images')],
hiddenimports=['datetime', 'json'],
hookspath=[],
runtime_hooks=[],
excludes=['tkinter'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='MyApp',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
Затем сборка: pyinstaller myscript.spec. В результате получается один exe с включенными файлами конфигурации и изображениями, без модуля tkinter. Размер 28 МБ.
C:\project\dist\MyApp.exe (28 452 352 bytes)
Пример 2: Nuitka с оптимизацией и поддержкой графики
Команда для приложения с Tkinter и Matplotlib:
nuitka --standalone --onefile --enable-plugin=tk-inter --enable-plugin=matplotlib --windows-disable-console --output-dir=dist_nuitka plotter.py
Лог сборки показывает этапы трансляции и компиляции. После завершения:
Nuitka:INFO: Successfully created 'C:\project\dist_nuitka\plotter.exe'. Size: 15.8 MB.
Файл не требует внешних библиотек и запускается без установленного Python.
Пример 3: cx_Freeze с включением ресурсов и настройкой зависимостей
Подготовка setup.py для приложения, использующего изображения и SQLite:
from cx_Freeze import setup, Executable
options = {
'build_exe': {
'includes': ['sqlite3', 'PIL'],
'include_files': [('data/icons', 'icons'), ('config.yaml', 'config.yaml')],
'excludes': ['matplotlib']
}
}
setup(
name='ImageEditor',
version='2.0',
description='Простой редактор изображений',
executables=[Executable('image_editor.py', base='Win32GUI')],
options=options
)
После python setup.py build в папке build появляется каталог с программой, папкой icons и файлом config.yaml. Размер 35 МБ.
build\exe.win-amd64-3.9\ImageEditor.exe (35 020 800 bytes)
Пример 4: auto-py-to-exe через командную строку (скрытый вызов)
Несмотря на графический интерфейс, инструмент позволяет передать параметры в PyInstaller напрямую:
auto-py-to-exe --file script.py --onefile --console --icon app.ico --output-dir output
Эквивалентно ручному вызову PyInstaller с теми же аргументами. Результат:
Output saved to: output/script.exe