Превращение Python приложений в EXE для Windows
Создание исполняемого EXE файла из скрипта Python на Windows позволяет распространять приложение без необходимости установки интерпретатора и пакетов. Рассмотрим основные инструменты и их применение.
Основные способы упаковки Python приложений в EXE
Как упаковать Python скрипт в один EXE файл с помощью PyInstaller?
PyInstaller является самым популярным и универсальным решением. Он анализирует импорты и собирает все зависимости в один пакет. Пример установки:
pip install pyinstallerPython program to exe (преобразование python в exe)
Базовая команда для создания одного файла без консоли (для GUI приложений):
pyinstaller --onefile --noconsole script.pyPython exe windows (создание exe из python на windows)
Опция --onefile упаковывает всё в один EXE, --noconsole скрывает окно командной строки. Результат появится в папке dist.
Как добавить иконку и дополнительные файлы?
pyinstaller --onefile --icon=app.ico --add-data 'data;data' script.pyExe file python (создание exe файла в python)
Параметр --add-data указывается в формате источник;назначение (для Windows точка с запятой). Иконка задаётся через --icon.
Типичная ошибка: модуль не найден при запуске EXE.
PyInstaller может не заметить динамически загружаемые модули. Решение: явно указать скрытые импорты через --hidden-import module. Например:
pyinstaller --onefile --hidden-import pandas script.pyКак использовать cx_Freeze для создания EXE?
cx_Freeze требует создания файла setup.py. Пример:
from cx_Freeze import setup, Executable
setup(
name='MyApp',
version='1.0',
description='Приложение',
executables=[Executable('script.py', base='Win32GUI')]
)Затем запустить python setup.py build. Результат в папке build. Этот подход удобен при сложной структуре проекта.
Как скомпилировать Python в C++ с Nuitka для большей производительности?
Nuitka превращает Python в C++, затем компилируется в EXE. Установка:
pip install nuitka
nuitka --standalone --onefile --windows-disable-console script.pyВажно: требуется компилятор (MSVC или MinGW). Время сборки дольше, но размер EXE меньше и скорость выше.
Как упаковать приложение с помощью py2exe?
Старый инструмент, поддерживает только Python 2, но иногда используется для легаси. Пример setup.py:
from distutils.core import setup
import py2exe
setup(console=['script.py'])Запуск: python setup.py py2exe. Результат в папке dist. Рекомендуется современные альтернативы.
Как использовать графический интерфейс auto-py-to-exe?
Надстройка над PyInstaller с веб-интерфейсом.
pip install auto-py-to-exe
auto-py-to-exeОткроется окно браузера, где настройки задаются визуально. Подходит для новичков.
Проблема: антивирус удаляет созданный EXE как потенциально опасный.
Это часто происходит из-за упаковки в один файл и использования обфускации. Решение: подписать код сертификатом, использовать дополнительные опции (--upx-dir для сжатия, которое снижает количество ложных срабатываний).
Расширенные примеры и тонкая настройка
PyInstaller: создание спецификации и тонкая настройка
После первой сборки генерируется файл script.spec, который можно редактировать. Пример для добавления всех файлов из папки и скрытых импортов:
# script.spec (автоматически сгенерированный)
a = Analysis(['script.py'],
pathex=['C:\project'],
binaries=[],
datas=[('data_folder', 'data_folder'), ('config.ini', '.')],
hiddenimports=['pandas', 'pyodbc'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
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=True,
icon='app.ico')Затем собрать через pyinstaller script.spec. Результат - полноценный EXE с кастомными настройками.
cx_Freeze: исключение лишних библиотек и уменьшение размера
from cx_Freeze import setup, Executable
import sys
build_exe_options = {
'packages': ['os', 'json', 'requests'],
'excludes': ['tkinter', 'tests'],
'include_files': ['data']
}
setup(
name='App',
version='1.0',
description='Description',
options={'build_exe': build_exe_options},
executables=[Executable('script.py', base='Win32GUI')]
)Команда сборки: python setup.py build. Размер итоговой папки уменьшается за счёт исключения ненужных модулей.
Nuitka: использование плагинов и оптимизация
Для ускорения работы с numpy или matplotlib подключаются плагины:
nuitka --standalone --onefile --enable-plugin=numpy --enable-plugin=matplotlib --plugin-enable=tk-inter script.pyРезультат - один EXE файл с включенной поддержкой.
Также можно задать выходную директорию:
nuitka script.py --standalone --output-dir=./buildВ папке build появится экзешник и сопутствующие библиотеки.
auto-py-to-exe: пример настройки через файл конфигурации
После конфигурации в GUI можно экспортировать JSON и использовать в командной строке:
auto-py-to-exe --config config.jsonСодержимое config.json (пример):
{
"script": "C:/project/script.py",
"onefile": true,
"console": false,
"icon": "C:/project/icon.ico",
"additional_files": {
"source": "C:/project/data",
"destination": "data"
},
"hidden_imports": ["pandas"]
}Такой подход удобен для повторяемых сборок.
Использование UPX для сжатия EXE
Установите UPX (например, from https://upx.github.io/), затем укажите путь при сборке PyInstaller:
pyinstaller --onefile --upx-dir=C:\upx script.pyРезультат - существенно меньший размер файла. Однако сжатие может увеличить время запуска.
Типичная проблема: ошибка при запуске из-за путей к ресурсам
В упакованном приложении временные файлы лежат в %TEMP% или папке приложения. Для доступа к ресурсам используйте sys._MEIPASS:
import sys, os
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath('.')
return os.path.join(base_path, relative_path)
# Использование
icon_path = resource_path('icon.ico')Этот код корректно находит файлы как в исходном скрипте, так и в собранном EXE.