Превращение Python кода в самостоятельное приложение
Основные способы упаковки Python скриптов
Наиболее популярное и универсальное решение - использовать PyInstaller. Этот инструмент собирает все зависимости вашего скрипта (включая интерпретатор, библиотеки и ресурсы) в один исполняемый файл или папку. PyInstaller поддерживает Windows, Linux и macOS.
Установка выполняется через pip:
pip install pyinstallerPython сделать 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.