Установщик 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: собираем установщик
- Загрузите zip в ExeTup. Он определит
MyApp.exeкак главную программу. - Укажите название приложения, версию, издателя и при желании лицензию.
- Выберите для всех пользователей (Program Files, запрос прав администратора) или для текущего пользователя (права администратора не нужны). Инструменты, которые раздают коллегам, часто удобнее ставить для текущего пользователя.
- Выберите архитектуру. PyInstaller собирает под тот Python, которым вы его запускали: 64-битный Python даёт 64-битное приложение.
- Загрузите
app.ico, включите нужные ярлыки и запустите сборку. - Скачайте
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.
Похожие руководства
- Как создать Setup.exe для приложения Windows (без кода)Что на самом деле делает Setup.exe, три способа его создать и как за несколько минут превратить папку с приложением в профессиональный установщик без написания скрипта.
- Как превратить .exe в установщик Windows (exe в Setup.exe)Как превратить обычный .exe или папку с .exe внутри в полноценный установщик Windows с ярлыками и деинсталлятором, не написав ни строчки установочного скрипта.
- «Система Windows защитила ваш компьютер»: что означает предупреждение SmartScreen и как от него избавитьсяПочему Windows показывает предупреждение «неизвестный издатель» на новом установщике, что могут нажать пользователи и как подпись кода и репутация убирают предупреждение.