Как превратить Python-скрипт в EXE: обзор инструментов и советы по выбору
Создаём удобные файлы для запуска Python-программы без Python.


Иллюстрация: Оля Ежак для Skillbox Media
Чтобы запустить файл программы, написанной на Python (такие файлы имеют расширение .py), нужно, чтобы на компьютере был установлен интерпретатор — специальная программа, которая выполняет код. Однако в Windows пользователи привыкли к исполняемым файлам с расширением .exe, которые запускаются двойным щелчком мыши и не требуют дополнительных действий.
Существует несколько инструментов, чтобы преобразовать Python-скрипт в EXE‑файл.
- PyInstaller — универсальный инструмент для создания EXE
- Auto-Py-to-Exe — утилита с графическим интерфейсом
- cx_Freeze — альтернативный подход создания EXE
- Py2exe — специализированный инструмент для исполняемых файлов
- Nuitka — компилятор Python-кода в машинный код
- Какой инструмент для создания EXE выбрать
Перед тем как использовать любой из этих инструментов, убедитесь, что у вас установлен Python версии 3.11 или 3.12, скачанный с официального сайта.
Также необходима операционная система Windows 10 или новее. Некоторые утилиты могут не работать с последними версиями Python — это связано с тем, что они не всегда обновляются одновременно с языком.
PyInstaller — самый популярный инструмент для создания EXE-файлов
PyInstaller — это инструмент, который превращает Python-скрипт в готовую программу. Внутри EXE оказывается не только код, но и сам интерпретатор Python, и все нужные библиотеки и ресурсы. В результате приложение запускается даже там, где Python не установлен.
PyInstaller очень популярен, и этому есть несколько причин.
Что в нём хорошего:
- Это самый привычный и проверенный способ распространять Python-программы — человеку, который скачает EXE, не придётся устанавливать Python и вручную тянуть зависимости.
- Есть режим «Один файл» — приложение упаковывается в EXE без дополнительных папок.
- PyInstaller умеет собирать GUI-приложения без лишней консоли на фоне, так что готовое окно выглядит аккуратно.
- Гибкость: можно тонко управлять, какие модули и ресурсы включать, дописывать SPEC-файл, использовать хуки для библиотек, которые сами по себе не подхватываются.
Что плохого:
- Даже простейшая программа после упаковки превращается в EXE на десятки мегабайт — это плата за то, что вместе с ней идёт Python и всё, что нужно для работы.
- Если выбрать режим «Один файл», приложение запускается чуть дольше: сначала оно распаковывается во временную папку, а только потом стартует.
- Не все зависимости попадают внутрь автоматически. С динамическими импортами, нативными библиотеками или ресурсами часто приходится возиться вручную.
- Есть ограничения по платформам. EXE можно собрать только на Windows, а чтобы получить приложение для Linux или macOS, придётся собирать его именно на этих системах.
- Возможны проблемы с системными библиотеками: DLL на Windows или SO на Linux могут вести себя непредсказуемо, если не добавить их правильно.
- EXE-файлы, собранные PyInstaller, иногда вызывают ложные тревоги у антивирусов, особенно если не подписывать их цифровой подписью.
Как установить PyInstaller
Вам понадобится менеджер пакетов PIP.
Введите в командной строке следующую команду:
pip install pyinstaller
Python автоматически установит PyInstaller.
Теперь нам нужен Python-скрипт, из которого мы сделаем наш экзешник.
Напишем код — приветствие в окне Window, используя графическую библиотеку Python Tkinter:
# Импортируем модуль Tkinter — стандартную библиотеку для создания GUI в Python
import tkinter as tk
# Создаём главное окно приложения
root = tk.Tk()
# Устанавливаем заголовок окна
root.title("Приветствие")
# Устанавливаем размеры окна: ширина 550 пикселей, высота 100 пикселей
root.geometry("550x100")
# Создаём текстовую метку с сообщением и шрифтом Arial, размер 12
label = tk.Label(
root,
text="Привет, это EXE файл, созданный с помощью PyInstaller!",
font=("Arial", 12)
)
# Размещаем метку в окне и добавляем отступ сверху/снизу
label.pack(pady=20)
# Запускаем главный цикл приложения — окно остаётся открытым, пока пользователь его не закроет
root.mainloop()
Сохраним этот код в файл с расширением .py, назвав его main_py_to_exe.py. Далее откроем командную строку в директории, в которой вы сохранили этот файл, и создадим EXE-файл из Python-скрипта, написав следующую команду:
pyinstaller --onefile --noconsole main_py_exe.py
pyinstaller — обращение к самой утилите по созданию EXE-файла из скрипта.
--onefile — упаковывает всё приложение в один EXE-файл. Исполняемый файл получается единственным, в нём содержатся все необходимые компоненты, включая интерпретатор Python и используемые библиотеки. Это полезно для минимального объёма дистрибутива, но размер самого файла может быть большим.
--noconsole — скрывает окно консоли при запуске приложения. Особенно актуально для GUI-приложений, чтобы пользователь видел только графический интерфейс, а не дополнительную консоль.
После выполнения предыдущей команды PyInstaller создаст папки dist, build и файл main_py_to_exe.spec.
- dist — папка с техническими и служебными файлами, такими как скомпилированные версии и логи. Её можно удалить, если вам нужен только исполняемый файл.
- build — папка, в которой лежит наш исполняемый файл.
- main_py_to_exe.spec — файл конфигурации приложения.
Можно сразу перейти в папку build, и проверить наше собранное приложение. Запускаем исполняемый файл main_py_exe.exe, На экране должно появиться следующее окно:

Установим иконку нашему приложению. Для этого поместим файл с расширением .ico рядом с SPEC-файлом. Для примера можно скачать любую бесплатную иконку с этого сайта. У нас иконка ChatGPT. Далее откроем конфигурационный файл с расширением .spec с помощью блокнота и, используя имя ICO-файла, в блок кода настроек EXE ( добавим следующую строку:
icon='logo_chat_gpt_icon_267516.ico'
Сохраним файл. Далее введём в этой директории в командной строке команду:
pyinstaller main_py_to_exe.spec
Эта команда соберёт заново EXE-файл на основе настроек в SPEC-файле. Теперь у приложения появилась иконка. У нас получилось так:

Все настройки SPEC-файла описаны в официальной документации PyInstaller.
Auto-Py-to-Exe — утилита с графическим интерфейсом
Auto-Py-to-Exe — это удобная оболочка для PyInstaller с графическим интерфейсом. Сама по себе она не заменяет PyInstaller, но с ней проще работать: вместо команд в консоли появляется окно, где можно выбрать скрипт, решить, как его упаковать, добавить иконку, подключить дополнительные файлы и ресурсы.
Что в нём хорошего:
- Всё происходит наглядно: все настройки перед глазами, видно, какие опции включены, и легко понять, что именно изменилось.
- Программа подсказывает, если путь к скрипту неправильный, иконка не того формата или версия Python несовместима.
- Можно сохранять конфигурации — если нужно собрать EXE с одинаковыми настройками, достаточно загрузить сохранённый JSON.
Что плохого:
- Auto-Py-to-Exe не заменяет PyInstaller и унаследовала все его ограничения — сложные проекты с нестандартными зависимостями могут потребовать ручной доработки.
- Иногда приходится вручную указывать дополнительные модули или пути к ресурсам, иначе программа выдаёт ошибку при запуске.
- Интерфейс работает через встроенный браузер (обычно Chrome) — если с ним что-то не так, возможны баги или странности.
- EXE-файл, собранный на одном компьютере, не всегда стабильно запускается на другом — особенно на разных версиях Windows или при отсутствии нужных библиотек.
- Для крупных проектов со множеством зависимостей, сложной архитектурой или требованием минимального размера сборки Auto-Py-to-Exe может оказаться недостаточно — придётся подключать PyInstaller напрямую.
Auto-Py-to-Exe хорошо подходит для небольших или средних проектов, особенно когда нужно быстро собрать GUI-приложение и не хочется разбираться с опциями PyInstaller вручную.
Как работать в Auto-Py-to-Exe
Подготовим консольное Python-приложение, из которого мы сделаем EXE-файл, написав и сохранив как main.py следующий код:
# Очистка экрана
os.system('cls' if os.name == 'nt' else 'clear')
# ASCII-логотип Auto-Py-to-Exe
logo = r"""
█████╗ ██╗ ██╗████████╗ ██████╗ ██████╗ ██╗ ██╗ ████████╗ ██████╗
██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗ ██╔══██╗╚██╗ ██╔╝ ╚══██╔══╝██╔═══██╗
███████║██║ ██║ ██║ ██║ ██║ ██████╔╝ ╚████╔╝ ██║ ██║ ██║
██╔══██║██║ ██║ ██║ ██║ ██║ ██╔═══╝ ╚██╔╝ ██║ ██║ ██║
██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ██║ ██║ ██║ ╚██████╔╝
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝
Auto-Py-to-Exe -- Консольный запуск
"""
print(logo)
print("\n" + "=" * 80)
print("START".center(80))
print("Нажмите 1 чтобы начать".center(80))
print("=" * 80)
# Ожидание действия пользователя
choice = input("\nВаш выбор: ")
if choice == "1":
print("\nAuto-Py-to-Exe запущен! (Здесь может быть логика сборки)")
else:
print("\nВыход из программы.")
Эта программа будет имитировать главное меню входа в приложение.
Чтобы установить Auto-Py-to-Exe, введите следующую команду в командной строке:
pip install auto-py-to-exe
Python установит Auto-Py-to-Exe. Чтобы запустить графический интерфейс Auto-Py-to-Exe, достаточно написать в консоли:
python -m auto-py-to
Далее откроется графическое меню Auto-Py-to-Exe.
Интерфейс состоит из трёх основных вкладок:
- Основные настройки:
- Загрузка исходного Python-скрипта.
- Выбор режима упаковки (One file или One directory).
- Выбор типа окна: GUI или Console.
- Дополнительные параметры:
- Настройка иконки для вашего приложения.
- Добавление скрытых импортируемых модулей.
- Определение зависимых файлов и ресурсов.
- Продвинутые настройки:
- Опции очистки временных файлов.
- Параметры виртуализации среды и поведения PyInstaller.

Справа вверху можно выбрать язык интерфейса. Auto-Py-to-Exe поддерживает множество языков, в том числе и русский.
Кликаем «Расположение» справа вверху и выбираем Python-скрипт, из которого будем делать EXE-файл.
Режим «Один файл» (--onefile) создаёт один исполняемый EXE-файл. «Одна папка» (--onedir) — создаст один каталог с EXE и DLL-библиотеками. Выберем «Одна папка».
Выбираем «Консольное приложение», так как у нас нет графического интерфейса.
Откройте расширенные настройки:

Впишите имя приложения name, включите режим clean и выставите log‑level‑значение WARN. Первый параметр будет удалять все старые файлы компиляции, а второй сделает вывод в консоль только важных предупреждений работы программы.
Обратите внимание на окно «Текущая команда» внизу главного окна Auto‑Py‑to‑Exe. Все введённые выше параметры автоматически дописываются как аргументы командной строки, как если бы мы писали это всё вручную через утилиту PyInstaller.

После всей базовой конфигурации нашего будущего EXE, нажимаем в самом низу «Конвертировать .py в exe». В директории с Python-кодом появится каталог output, а в нём будет лежать наш EXE-файл. Запускаем его.

Созданный с помощью Auto-Py-to-Exe экзешник готов.
cx_Freeze — альтернативный подход
cx_Freeze — это библиотека на Python, которая «замораживает» скрипт и превращает его в готовое приложение. Вместе с кодом упаковываются интерпретатор и все нужные зависимости, так что программа запускается без установленного Python. Инструмент работает на Windows, macOS и Linux.
Что в нём хорошего:
- Программы, собранные через cx_Freeze, обычно запускаются быстрее, чем EXE-файлы, сделанные PyInstaller в режиме «Один файл».
- Библиотека кроссплатформенная — можно собирать приложения не только для Windows, но и под другие операционные системы.
- Настройки гибкие: можно включать или исключать модули, добавлять картинки, шрифты и другие ресурсы, настраивать поведение GUI‑приложения (например, скрыть консоль).
- Проект активно поддерживается — документация обновляется, и последняя версия работает с Python до 3.13.
Что плохого:
- Нет режима «Всё в одном файле» — вместо одного EXE получается папка со множеством библиотек.
- Папка с программой может сильно разрастись, особенно если в проекте много зависимостей.
- Иногда cx_Freeze не включает нужные модули — особенно если они загружаются динамически или через нестандартные импорты. Их приходится добавлять вручную.
- Возможны проблемы с системными библиотеками — DLL на Windows или SO/DYLIB на Linux и macOS могут конфликтовать по версиям или лицензиям.
- Программа требует больше ручной настройки: нужно писать setup-скрипт, разбираться с GUI и путями к ресурсам. Это несложно, но не всегда понятно с первого раза.
Начинаем работу с cx_Freeze
Используя графическую библиотеку Tkinter, подготовим простой Python-скрипт, в котором GUI-окно будет взаимодействовать с консолью:
# Импортируем модуль Tkinter и присваиваем ему псевдоним 'tk'
import tkinter as tk
# Определяем простую функцию, которая выводится в консоль при событии
def say_hello():
# Функция выводит строку в консоль
print("Привет!")
# Создаём объект класса Tk(), представляющий основное окно приложения
root = tk.Tk()
# Устанавливаем заголовок окна
root.title("HelloApp")
# Создаём кнопку внутри окна root
# Параметры: родительский контейнер, надпись на кнопке, команда обработчик события
btn = tk.Button(root, text="Нажми меня", command=say_hello)
# Размещаем кнопку в окне с отступами вокруг неё
btn.pack(padx=20, pady=20)
# Запускаем основной цикл обработки событий Tkinter
root.mainloop()
Сохраним этот код в файл с именем hello.py.
Далее установим cx_Freeze. Установка cx_Freeze аналогична другим инструментам. Для этого введите в командной строке:
pip install cx-freeze
Теперь нужно подготовить специальный файл конфигурации, определяющий структуру будущего EXE-пакета:
from cx_Freeze import setup, Executable
setup(
name = "your_app_name",
version = "1.0",
description = "Описание вашего приложения",
executables = [Executable("hello.py")]
)
Здесь указаны базовые параметры будущей EXE-программы:
- name — имя;
- version — версия;
- description — описание;
- executables — имя исполняемых файлов.
Сохраним этот файл с именем setup.py в одной директории с Python-скриптом.
Открываем консоль в текущей директории и создаём исполняемый файл командой:
python setup.py build
Результатом станет папка build, содержащая ваше готовое приложение.

Запустим hello.exe, откроются два окна: консоль и графический интерфейс с кнопкой.

Если всё сделано правильно, кнопка должна выводить приветствие в консоли.

Простое EXE-приложение с консолью и графическим интерфейсом создано с помощью cx_Freeze.
Py2exe — специализированный инструмент для создания EXE
Что в нём хорошего:
- Умеет собирать консольные и GUI-приложения.
- Есть параметры bundle_files и compressed — можно управлять плотностью упаковки и уменьшать размер.
- При правильной настройке можно получить один EXE-файл плюс нужные библиотеки.
- Поддерживает актуальные версии Python — вплоть до 3.13.
- Проект активный: выходят релизы, добавляется поддержка новых версий, исправляются баги.
Что плохого:
- Работает только под Windows.
- Даже при сборке «Всё в одном» часто остаются внешние DLL или библиотеки, которые нужно добавлять вручную.
- Настройка может потребовать явного указания зависимостей — особенно при динамических импортах или нестандартных механизмах.
- Компрессия и упаковка могут замедлить сборку и усложнить отладку.
Как работать с Py2exe
Подготовим Python-код, из которого будем делать дальнейшую программу:
import tkinter as tk # Подключение стандартной графической библиотеки Tkinter
import random # Модуль для генерации случайных чисел
import time # Используется для паузы между действиями
class ColorfulSquares(tk.Frame): # Класс наследуется от Frame, представляет собой область содержимого
def __init__(self, master=None): # Конструктор класса принимает родителя (главное окно)
super().__init__(master) # Вызов конструктора родительского класса (Frame)
self.master = master # Присваиваем ссылку на родительский компонент
self.pack(fill="both", expand=True) # Отображение компонента во всём окне, занимающем свободное пространство
self.canvas = tk.Canvas(self, bg="white", highlightthickness=0) # Создаём холст для рисования
self.canvas.pack(fill="both", expand=True) # Холст занимает всё доступное пространство
self.canvas.bind('<Button-1>', self.add_square) # Привязываем реакцию на клик мыши к методу add_square
def add_square(self, event): # Метод, вызываемый при щелчке мыши """ Отображает цветной квадрат в точке клика """
square_size = 50 # Размер стороны квадрата
x = event.x - square_size / 2 # Координата X центра квадрата
y = event.y - square_size / 2 # Координата Y центра квадрата
colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'] # Палитра цветов
color = random.choice(colors) # Случайный выбор цвета из списка
item = self.canvas.create_rectangle(x, y, x + square_size, y + square_size, fill=color) # Нарисовали квадрат
self.after(2000, lambda: self.canvas.delete(item)) # Удаляем квадрат через 2 секунды
if __name__ == '__main__': # Точка входа в программу root = tk.Tk() # Создаём главное окно приложения
root.title("Цветные квадраты") # Назначаем заголовок окна
app = ColorfulSquares(master=root) # Создаём экземпляр класса ColorfulSquares
app.mainloop() # Запускаем бесконечный цикл обработки событий
Мы создали окно, в котором при щелчке мышью по пустому пространству появится цветной квадрат. Сохраним файл под именем squares.py.
Установим Py2exe через командную строку:
pip install py2exe
Py2exe, как и cx_Freeze, требует создания конфигурационного файла setup.py, задающего параметры сборки. Для сборки EXE-файла можно ограничиться минимальными настройками:
# setup.py
from setuptools import setup
import py2exe
setup(
windows=[{'script': 'squares.py'}], # Основное графическое приложение
zipfile=None,
options={
'py2exe': {
'bundle_files': 1, # Созда`м единый и оптимизированный EXE-файл
'optimize': 2 # Уровень оптимизации
}
},
data_files=[] # Здесь можете добавить любые внешние ресурсы (графику, иконки и так далее)
)
Откроем командную строку в директорию и скомпилируем наш EXE:
python setup.py py2exe
Если всё завершилось без ошибок, в папке с кодом должно было появиться две папки: dist и build. В папке dist находится готовый исполняемый EXE и нужные ему для работы DLL-файлы. Запустим EXE.

EXE-файл, созданный с помощью Py2exe, готов.
Nuitka — компилятор Python-кода в машинный код
Что в нём хорошего:
- Nuitka — это компилятор, который превращает Python-скрипт в машинный код.
- Вместе с кодом он упаковывает интерпретатор и зависимости, поэтому Python на компьютере не нужен.
- Работает на Windows, macOS и Linux.
- Готовое приложение может запускаться быстрее, чем обычный скрипт.
- Проект активно развивается, документация обновляется, поддерживается Python до версии 3.13.
Что плохого:
- Сборка занимает больше времени и ресурсов, чем у cx_Freeze или PyInstaller: идёт полноценная компиляция.
- Настроек много, и новичку может быть непросто сразу во всём разобраться.
- Документация не всегда дружелюбна, так что часть проблем приходится решать самому.
Как начать работать с Nuitka
Напишем простую консольную программу на Python:
def greet_user():
# Запрашиваем ввод имени пользователя
user_name = input("Введите Ваше имя: ")
# Приветствуем пользователя
print(f"Привет, {user_name}! Добро пожаловать в наше приложение.")
# Точка входа в программу
if __name__ == "__main__":
greet_user()
Устанавливаем Nuitka через pip в командной строке:
pip install nuitka
Теперь создадим исполняемый файл с помощью Nuitka:
nuitka --standalone main.py
--standalone — без указания этого аргумента Python создаст C-файлы и DLL‑файлы библиотек, а если указать его, Nuitka создаёт отдельный исполняемый файл EXE.
После компиляции должна появиться папка main.dist, в которой будет лежать наша готовая программа с расширением .exe.

Какой инструмент для создания EXE выбрать
Выбор зависит от того, что хочется получить в итоге.
Если нужно быстро и без проблем собрать EXE, подойдёт PyInstaller. Он работает почти со всеми библиотеками, и к нему есть хорошая документация и примеры. Но EXE-файлы получаются довольно тяжёлые, а если собирать «одним файлом», то стартовать программа будет медленнее.
Auto-Py-to-Exe — это по сути тот же PyInstaller, только с удобным графическим интерфейсом. Всё делается с помощью мышки: выбор скрипта, иконки, режима сборки. Но под капотом всё равно PyInstaller, так что ограничения те же.
Если нужно, чтобы приложение запускалось не только на Windows, но и на Linux или macOS, то лучше использовать cx_Freeze. Он кроссплатформенный, но требует setup-скрипта и немного больше усилий — новичкам может быть сложнее.
Py2exe — инструмент только для Windows. Когда-то был очень популярен, но сейчас его реже используют. Тем не менее он работает.
Если важна скорость конечного приложения, подойдёт Nuitka. Это не упаковщик, а компилятор: он переводит Python в C и потом в машинный код. Программы на выходе действительно работают быстрее, но сборка дольше и сложнее в настройке.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!