Превращение Python кода в самостоятельное приложение

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

Основные способы упаковки Python скриптов

Наиболее популярное и универсальное решение - использовать PyInstaller. Этот инструмент собирает все зависимости вашего скрипта (включая интерпретатор, библиотеки и ресурсы) в один исполняемый файл или папку. PyInstaller поддерживает Windows, Linux и macOS.

Установка выполняется через pip:

pip install pyinstaller

Python сделать exe (создание exe файла из python)

Базовая команда для создания одного exe файла:

pyinstaller --onefile my_script.py

Ключ --onefile упаковывает всё в один исполняемый файл. Если необходимо скрыть окно консоли (для GUI приложений), добавляют --windowed (или -w). Для задания иконки используют --icon=icon.ico.

Пример простого скрипта hello.py:

print("Hello, World!")
input("Нажмите Enter для выхода...")

Команда:

pyinstaller --onefile hello.py

Результат появится в папке dist.

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

  • Ошибки импорта - PyInstaller может не обнаружить динамически загружаемые модули. Решение: указать их явно через --hidden-import.
  • Большой размер exe - включается весь интерпретатор. Уменьшить можно использованием виртуального окружения.
  • Антивирус блокирует файл - подписать приложение цифровой подписью или добавить в исключения.

Как создать exe с сохранением структуры папок и дополнительных файлов?

Для таких задач подходит cx_Freeze. Он генерирует папку с exe и библиотеками. Установка:

pip install cx-freeze

Пример файла конфигурации setup.py:

from cx_Freeze import setup, Executable

setup(
    name="MyApp",
    version="1.0",
    description="Sample application",
    executables=[Executable("hello.py", base="Console")]
)

Запуск сборки:

python setup.py build

Собранное приложение будет в папке build. Можно гибко управлять включаемыми пакетами через опции packages и excludes.

Частая ошибка: отсутствие модуля tkinter при сборке GUI приложений. Необходимо явно указать tkinter в packages.

Как получить exe с максимальной производительностью или маскировкой кода?

Nuitka транслирует Python код в C++, затем компилирует в exe. Это дает прирост скорости и защиту от декомпиляции. Установка:

pip install nuitka

Пример команды:

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

Флаг --standalone создает папку с зависимостями, --onefile - единственный exe. Плагины включают поддержку разных библиотек (tkinter, PyQt и др.). Nuitka работает дольше, чем PyInstaller, но результат часто компактнее.

Проблема: ошибка компиляции при использовании нестандартных модулей на C. Решение - указать их через --include-module.

Как упаковать скрипт без работы с командной строкой?

auto-py-to-exe предоставляет графический интерфейс, который настраивает PyInstaller. Установка и запуск:

pip install auto-py-to-exe
auto-py-to-exe

Откроется окно, где можно выбрать скрипт, опции (один файл, без консоли, иконка) и нажать кнопку сборки. Идеально для начинающих.

Как использовать старый, но проверенный инструмент?

py2exe (аналог для Windows) ранее был популярен. Сейчас его развитие замедлилось, но он все еще может работать с Python 3.x при установке из репозитория. Установка:

pip install py2exe

Скрипт setup.py:

from distutils.core import setup
import py2exe

setup(console=['hello.py'])

Команда:

python setup.py py2exe

Результат - папка dist. Однако py2exe менее гибок, и для современных проектов рекомендуется PyInstaller или cx_Freeze.

Расширенные примеры сборки exe с пояснениями

Пример 1. PyInstaller с дополнительными данными и скрытыми импортами.

Рассмотрим скрипт, который читает файл данных и показывает окно с изображением:

Пример
import tkinter as tk
from PIL import Image, ImageTk
import os

# Чтение файла с данными
data_file = "data.txt"
with open(data_file, "r", encoding="utf-8") as f:
    message = f.read()

# Создание окна
root = tk.Tk()
root.title("Пример")
label = tk.Label(root, text=message)
label.pack()

# Загрузка изображения
img = Image.open("background.png")
img = ImageTk.PhotoImage(img)
panel = tk.Label(root, image=img)
panel.pack()

root.mainloop()

Команда для сборки с указанием ресурсов:

Пример
pyinstaller --onefile --windowed --add-data "data.txt;." --add-data "background.png;." --hidden-import PIL._tkinter_finder my_app.py

Здесь --add-data добавляет файлы в корень временной папки при запуске. Обратите внимание на точку с запятой (Windows) или двоеточие (Linux).

Если использовать spec-файл, можно более гибко настроить сборку. После первой команды PyInstaller создает my_app.spec. Пример редактирования:

Пример
# -*- mode: python ; coding: utf-8 -*- 
a = Analysis(
    ['my_app.py'],
    pathex=[],
    binaries=[],
    datas=[('data.txt', '.'), ('background.png', '.')],
    hiddenimports=['PIL._tkinter_finder'],
    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, [], exclude_binaries=True, name='my_app', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False, icon='icon.ico')
coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='my_app')

Затем выполнить pyinstaller my_app.spec.

Пример 2. Nuitka с поддержкой Qt и сжатием.

Скрипт на PyQt5:

Пример
import sys
from PyQt5.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
label = QLabel("Привет из Nuitka!")
label.show()
sys.exit(app.exec_())

Команда сборки с минимизацией размера:

Пример
nuitka --standalone --onefile --enable-plugin=pyqt5 --lto=yes hello_qt.py

Флаг --lto=yes включает Link Time Optimization для уменьшения размера. Возможный вывод в консоли:

Nuitka:INFO: Starting Python compilation with Nuitka ...
Nuitka:INFO: Completed in 120 seconds.
Nuitka:INFO: Produced standalone folder: hello_qt.dist

Если нужен только один файл, добавить --onefile. Однако при использовании Qt размер может быть большим.

Возможная ошибка: при сборке с --onefile на Windows возникает предупреждение о пути к Qt плагинам. Решение: указать путь явно через переменную среды QT_PLUGIN_PATH в скрипте.

Пример 3. cx_Freeze с настройкой includes и excludes.

Для приложения, использующего requests и numpy, напишем детальный setup.py:

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

build_exe_options = {
    "packages": ["os", "requests", "numpy"],
    "excludes": ["tkinter", "test"],
    "include_files": [("config.json", "config.json")]
}

setup(
    name="DataProcessor",
    version="2.0",
    description="Обработка данных",
    options={"build_exe": build_exe_options},
    executables=[Executable("process.py", base="Console")]
)

Команда: python setup.py build. В результате в папке build/exe.win-amd64-3.10 появится exe и все необходимые библиотеки.

Проверка размера: часто cx_Freeze создает папку ~50 МБ для простого скрипта, что сопоставимо с PyInstaller.

Создание exe файла из Python - comments

En
Python сделать exe (python)