Превращение Python приложений в EXE для Windows

Раздел: Разработка на Python -> упаковка приложений

Создание исполняемого EXE файла из скрипта Python на Windows позволяет распространять приложение без необходимости установки интерпретатора и пакетов. Рассмотрим основные инструменты и их применение.

Основные способы упаковки Python приложений в EXE

Как упаковать Python скрипт в один EXE файл с помощью PyInstaller?

PyInstaller является самым популярным и универсальным решением. Он анализирует импорты и собирает все зависимости в один пакет. Пример установки:

pip install pyinstaller

Python program to exe (преобразование python в exe)

Базовая команда для создания одного файла без консоли (для GUI приложений):

pyinstaller --onefile --noconsole script.py

Python exe windows (создание exe из python на windows)

Опция --onefile упаковывает всё в один EXE, --noconsole скрывает окно командной строки. Результат появится в папке dist.

Как добавить иконку и дополнительные файлы?

pyinstaller --onefile --icon=app.ico --add-data 'data;data' script.py

Exe 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.

создание exe из Python на Windows - comments

En
Python exe windows (python)