Python
PyInstaller: как собрать Python в exe и не потерять файлы проекта
PyInstaller нужен, когда вы написали Python-скрипт и хотите запустить его как обычную программу. На Windows результатом часто ждут .exe файл, на macOS и Linux — исполняемый файл или папку сборки
Важно: PyInstaller не «переводит Python в C++». Он собирает ваш код, интерпретатор Python и зависимости в пакет, который можно запускать без отдельной команды python app.py
Что мы соберем
Создайте файл app.py
name = input("Как вас зовут? ")
print(f"Привет, {name}!")
input("Нажмите Enter, чтобы закрыть окно")
Последняя строка нужна для Windows, если вы запускаете .exe двойным кликом. Без нее окно может быстро закрыться после вывода текста
Подготовьте проект
Создайте папку pyinstaller-demo
Проверьте, что скрипт запускается обычным способом
Windows:
py app.py
python3 app.py
Если обычный запуск не работает, PyInstaller тоже не спасет. Сначала нужно исправить сам код
Создайте виртуальное окружение
Windows:
py -m venv .venv
.venv\Scripts\activate
python3 -m venv .venv
source .venv/bin/activate
Установите PyInstaller:
python -m pip install pyinstaller
Проверьте установку:
pyinstaller --version
Первая сборка
Выполните команду:
pyinstaller app.py
После сборки появятся папки build и dist, а также файл app.spec
Главное лежит в dist/app/. На Windows внутри будет app.exe
Один exe-файл через onefile
Если хотите получить один файл, используйте --onefile
pyinstaller --onefile app.py
Результат будет лежать в dist/app.exe на Windows или dist/app на macOS/Linux
У --onefile есть цена: программа может запускаться чуть дольше, потому что при старте ей нужно распаковать временные файлы
Для учебы удобно начинать с обычной сборки без --onefile, а когда все работает — собирать один файл
Как убрать консольное окно
Для графических приложений иногда используют --windowed
pyinstaller --onefile --windowed app.py
Но для консольной программы с input() этот режим не подходит. Если убрать консоль, пользователь не увидит, куда вводить имя
Если программа общается через input() и print(), консоль оставляем
Как добавить файлы рядом с программой
Частая проблема: в Python-скрипте есть data.csv, картинка или шаблон, но в .exe программа его не видит
Для начала соберите обычную папку без --onefile и положите файл рядом с исполняемым файлом в dist/app
Если нужно упаковать файл через PyInstaller, используйте --add-data
Windows:
pyinstaller --onefile --add-data "data.csv;." app.py
pyinstaller --onefile --add-data "data.csv:." app.py
Разделитель отличается: на Windows точка с запятой, на macOS и Linux двоеточие
Можно ли собрать exe для Windows на macOS
В обычном учебном сценарии — нет. PyInstaller собирает программу под ту систему, на которой запущена сборка
Если нужен Windows .exe, собирайте на Windows
Если нужен файл для macOS, собирайте на macOS
Если нужен Linux-бинарник, собирайте на Linux
Частые ошибки
ModuleNotFoundError после запуска exe
Библиотека установлена не в то окружение. Активируйте .venv, установите пакет и соберите заново
python -m pip install имя_пакета
pyinstaller --onefile app.py
Программа запускается и сразу закрывается
Добавьте временно:
input("Нажмите Enter для выхода")
Так вы увидите текст ошибки или результат выполнения
После сборки ничего не изменилось
Удалите папки build, dist и файл .spec, затем соберите заново. Иногда новичок запускает старый .exe и думает, что PyInstaller не подхватил изменения
Чем этот материал отличается от обычного Python to Exe
Запрос py to exe часто закрывают одной кнопкой или онлайн-конвертером. Здесь важнее понять рабочий процесс: проверить скрипт, создать виртуальное окружение, собрать через PyInstaller, разобраться с onefile, файлами данных и запуском на целевой системе
Что почитать дальше по Python
Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:
- Как разбить Python-скрипт на несколько файлов: modules, imports и структура проекта
- Face recognition Python: как установить и что делать при ошибках dlib
- Pandas и Matplotlib с Python: основы анализа данных
- Path в Python: как найти путь к файлу, папке и самому Python