Чтобы превратить Python-скрипт в EXE, собирайте его на Windows командой py -m PyInstaller --onefile app.py и забирайте готовый файл из папки dist. Начните с режима onedir, убедитесь, что программа запускается, и только потом переходите к одному файлу. PyInstaller кладёт внутрь интерпретатор и зависимости, поэтому на компьютере пользователя Python не нужен.
Обычно эта задача появляется после первого полезного скрипта: калькулятор работает из VS Code, но друг не хочет устанавливать Python и открывать терминал. EXE решает доставку, но не чинит ошибки программы. Если скрипт не запускается командой py app.py, сборка лишь упакует ту же проблему в более тяжёлый файл.
Запускаем исходный .py из чистого виртуального окружения и фиксируем зависимости.
Сначала используем onedir для диагностики, затем добавляем --onefile.
Открываем результат из dist, проверяем файлы данных и запуск на другом профиле Windows.
Что именно делает PyInstaller и где искать готовый файл
PyInstaller анализирует импорты, добавляет интерпретатор Python и нужные библиотеки, а затем создаёт автономный набор. Это упаковщик, а не компилятор исходника в машинный код. После команды рядом со скриптом появляются три объекта: служебная папка build, файл настроек .spec и результат в dist. Распространять нужно содержимое dist, а не случайный файл из build.
| Объект | Что внутри | Что с ним делать |
|---|---|---|
build/ | Временные файлы анализа и сборки | Не отправлять пользователю, можно пересоздать |
dist/app/ | EXE и библиотеки режима onedir | Запускать весь каталог целиком |
dist/app.exe | Один файл режима onefile | Отправлять после проверки |
app.spec | Рецепт сборки, данные и скрытые импорты | Хранить рядом с проектом при сложной конфигурации |

Исходник проходит анализ, а пользователю уходит только проверенный результат из dist.
Собираем первый EXE в отдельном окружении
Создайте папку проекта и файл hello.py. Виртуальное окружение отделит PyInstaller и библиотеки от других проектов. В PowerShell активируйте окружение, поставьте упаковщик через тот же интерпретатор и выполните сначала обычную сборку. Если команда py недоступна, используйте python в тех же строках.
# hello.py
name = input("Your name: ").strip() or "Developer"
print(f"Hello, {name}!")
input("Press Enter to close...")
# PowerShell в папке проекта
py -m venv .venv
.\.venv\Scripts\Activate.ps1
py -m pip install --upgrade pyinstaller
py -m PyInstaller hello.py
# После успешного теста
py -m PyInstaller --onefile --name HelloApp hello.py
.\dist\HelloApp.exe- В конце журнала есть строка об успешном завершении, а в
distпоявился каталог или EXE. - При запуске программа спрашивает имя, печатает приветствие и ждёт Enter, поэтому окно не закрывается мгновенно.
- Повторная сборка с
--name HelloAppсоздаёт понятное имя вместо имени исходного файла.

Onedir проще чинить, onefile проще передавать. Начинать выгоднее с первого.
Когда выбирать onefile, onedir и windowed
Один EXE удобнее отправлять, но он распаковывает служебные файлы во временный каталог при каждом запуске. Режим onedir быстрее диагностировать: рядом видны библиотеки и ресурсы. Флаг --windowed подходит графическому приложению, но скрывает консоль вместе с сообщениями об ошибках. Не добавляйте его, пока сборка не стала стабильной.
| Флаг | Результат | Когда использовать |
|---|---|---|
| без флага | Папка onedir | Первая сборка и поиск пропавших библиотек |
--onefile | Один исполняемый файл | Небольшая проверенная программа |
--windowed | Без консольного окна | Tkinter, PySide или другая GUI-программа |
--icon app.ico | Своя иконка Windows | Финальная версия после рабочего прототипа |
--add-data | Дополнительные картинки и конфиги | Когда код читает файлы во время запуска |
Практика: собираем и проверяем HelloApp
Проверка должна повторять путь будущего пользователя. Не запускайте EXE только из терминала разработчика: там уже есть переменные окружения, библиотеки и привычная рабочая папка. Скопируйте результат в отдельный каталог и откройте двойным щелчком. Затем повторите запуск из PowerShell, чтобы увидеть код возврата и сообщения.
- Запустите
py hello.pyи проверьте два ввода: непустое имя и пустую строку. - Создайте
.venv, установите PyInstaller и выполните сборку без--onefile. - Откройте
dist/hello/hello.exe. Не переносите только EXE из папки onedir отдельно от библиотек. - Если всё работает, соберите
--onefile --name HelloAppи запустите новый файл. - Скопируйте EXE в пустую папку вне проекта и повторите оба варианта ввода.
- Только после этого добавляйте иконку, данные или
--windowed, по одному изменению за сборку.
- В
distлежитHelloApp.exe, который работает без активированного окружения. - Пустой ввод даёт приветствие для Developer, обычный ввод возвращает указанное имя.
- После переноса в пустую папку программа не ищет исходный
hello.py.

Симптом подсказывает уровень: код, импорт, ресурс или операционная система.
Почему EXE не запускается или теряет файлы
Если двойной щелчок ничего не показывает, откройте PowerShell, перейдите в dist и запустите EXE оттуда. Консоль сохранит traceback. Ошибки обычно относятся к одному из трёх уровней: исходный код, импорт библиотеки или путь к данным. Пересобирать десять раз одной командой бессмысленно, пока не определён уровень.
Консоль скрыта, поэтому ошибка выглядит как мгновенное закрытие. Уберите флаг и сначала прочитайте traceback.
После упаковки рабочая папка может отличаться. Формируйте путь от __file__ или добавляйте ресурс через spec-файл.
PyInstaller не является обычным кросс-компилятором. Соберите Windows-результат на Windows нужной архитектуры.
Самодельные неподписанные EXE могут вызвать предупреждение. Не отключайте защиту, проверьте файл и объясните происхождение получателю.
Где лежит готовый EXE?
В папке dist. Каталог build содержит служебные файлы.
Нужен ли Python пользователю?
Нет. PyInstaller включает интерпретатор и зависимости в поставку.
Почему лучше начать с onedir?
В папке видны компоненты сборки, поэтому проще найти отсутствующую библиотеку или файл.
Что делает --windowed?
Скрывает консольное окно. Вместе с ним исчезает и удобный вывод ошибок.
Можно ли собрать Windows EXE на macOS?
Обычный рабочий процесс PyInstaller предполагает сборку отдельно на каждой целевой системе.
Потренируйте файлы, функции и обработку ошибок в курсе Python. Если среда ещё не настроена, используйте гайд по VS Code для Python или запускайте упражнения прямо в Кодике.
При ошибке импорта откройте разбор ModuleNotFoundError, а проблему с командой установки разбирает статья про pip на Windows.