Перейти к содержимому

Установщик Windows для приложения на Python (PyInstaller в Setup.exe)

Соберите программу на Python с помощью PyInstaller и упакуйте результат в полноценный установщик Windows с ярлыками и деинсталлятором. Почему onedir лучше onefile для установщиков и какие настройки действительно важны.

Обновлено 31 октября 2026 г. · 3 мин чтения

PyInstaller превращает программу на Python в .exe для Windows, который работает без установленного Python. Чего он не делает, так это не устанавливает программу: ни пункта в меню «Пуск», ни деинсталлятора, ничего в «Параметрах» Windows. Для этого результат PyInstaller оборачивают в установщик. Вот весь путь от скрипта до Setup.exe.

Шаг 1: собираем приложение с помощью PyInstaller

Установите PyInstaller в окружение проекта и запустите сборку из папки, где лежит ваш входной скрипт:

pip install pyinstaller
pyinstaller --noconsole --onedir --name MyApp --icon app.ico main.py

Что делают флаги:

  • --onedir (по умолчанию) создаёт папку dist/MyApp/ с MyApp.exe и папкой библиотек _internal/. Используйте этот режим для установщиков. Он запускается быстрее, чем --onefile, потому что при каждом запуске ничего не нужно распаковывать во временную папку, и меньше привлекает внимание антивирусных эвристик.
  • --noconsole скрывает чёрное окно консоли у приложений с графическим интерфейсом (Tkinter, PyQt, Kivy и т. д.). Для утилит командной строки его не указывайте.
  • --icon app.ico встраивает значок в .exe. Используйте тот же .ico и для установщика.
  • --name MyApp задаёт имя исполняемого файла и выходной папки.

Файлы данных, которые программа открывает во время работы (изображения, шаблоны конфигурации, модели), нужно добавить через --add-data "src;dest" или в файле .spec, иначе их не будет в dist/MyApp/.

Откройте dist/MyApp/MyApp.exe и убедитесь, что приложение работает. Если есть возможность, скопируйте всю папку dist/MyApp на другой ПК с Windows без Python и запустите там тоже.

Шаг 2: упаковываем выходную папку в zip

Заархивируйте содержимое dist/MyApp/: MyApp.exe и _internal/. Не включайте build/, файл .spec и дерево исходников. Именно zip будет установлен, байт в байт.

Шаг 3: собираем установщик

  1. Загрузите zip в ExeTup. Он определит MyApp.exe как главную программу.
  2. Укажите название приложения, версию, издателя и при желании лицензию.
  3. Выберите для всех пользователей (Program Files, запрос прав администратора) или для текущего пользователя (права администратора не нужны). Инструменты, которые раздают коллегам, часто удобнее ставить для текущего пользователя.
  4. Выберите архитектуру. PyInstaller собирает под тот Python, которым вы его запускали: 64-битный Python даёт 64-битное приложение.
  5. Загрузите app.ico, включите нужные ярлыки и запустите сборку.
  6. Скачайте Setup.exe и протестируйте его на Windows.

Особенности Python

  • Ложные срабатывания антивирусов. Сборки PyInstaller часто становятся мишенью чересчур осторожных антивирусных эвристик, особенно сборки --onefile. Сборка onedir внутри обычного установщика, размещённая в Program Files, ведёт себя как любая другая программа, и её реже помечают. Подпись кода помогает ещё больше.
  • Размер. Приложение на Tkinter занимает 20–40 МБ; PyQt, NumPy или PyTorch увеличивают эту цифру во много раз. LZMA-сжатие установщика обычно уменьшает её вдвое. Исключайте неиспользуемые модули через --exclude-module, чтобы сборка оставалась компактной.
  • Первый запуск. Поскольку onedir ничего не распаковывает, первый запуск такой же быстрый, как и все последующие.
  • Обновления. Выпускайте новый установщик с более высоким номером версии. Установка поверх предыдущей версии заменяет файлы на месте.
  • Консольные утилиты. Для программы командной строки рассмотрите установку на уровне компьютера и сообщите пользователям папку установки; установщик не добавляет её в PATH.

Альтернативы

Nuitka и cx_Freeze тоже создают папку с .exe; шаг с установщиком такой же. Если хотите написать скрипт установщика сами, и NSIS, и Inno Setup работают с результатом PyInstaller.

Частые вопросы

Что выбрать для установщика: --onefile или --onedir?

--onedir. Установщик и так даёт пользователям один Setup.exe для скачивания, поэтому нет смысла терпеть медленный запуск и распаковку во временную папку, свойственные onefile. К тому же onedir — режим PyInstaller по умолчанию.

Нужен ли пользователям установленный Python?

Нет. PyInstaller складывает интерпретатор Python и библиотеки в папку, а установщик переносит эту папку на компьютер пользователя.

Почему Windows предупреждает о моём установщике?

Новые неподписанные загрузки вызывают срабатывание Microsoft SmartScreen, пока не наберут репутацию. Что с этим делать, рассказано в руководстве по SmartScreen.

Можно ли включить пример конфигурации или папку с данными?

Да. Либо добавьте её через --add-data в PyInstaller, тогда она окажется внутри _internal/, либо добавьте на шаге «Другие файлы» в ExeTup, чтобы разместить рядом с MyApp.exe.

Похожие руководства