Как сделать .exe файл из программы на Python
10-03-2023Время чтения ~ 4 мин.Python 3692
Создание исполняемого .exe файла из программы на Python обычно требуется для того, чтобы скрыть исходный код программы. Также создание отдельного исполняемого файла поможет упростить работу с пользователями: им не нужно будет дополнительно устанавливать Python.
Сам по себе Python предполагает использование только в виде открытых исходных файлов. Очень похожая ситуация наблюдается и с PHP, но PHP — это серверный язык, поэтому к файлу доступа не будет, а Python — язык общего назначения — на нём можно создавать полноценные приложения. Поэтому задача как-то их скрыть — достаточно актуальная.
Есть несколько проектов, которые позволяют создавать exe-файл. Один из них — это PyInstaller. Рассмотрим пошагово как с ним работать.
Использование PyInstaller
Первым делом следует установить PyInstaller. Делается это через PIP:
pip install -U pyinstaller
Проверить корректность установки можно такой командой в консоли:
pyinstaller -v
Должна появится версия, например 5.8.0
.
После этого вы переходите в каталог своего проекта, где лежат Python-файлы и запускаете PyInstaller. На начальном этапе, есть смысл просто проверить итог компиляции.
pyinstaller taro.py
PyInstaller начнёт свою работу и на выходе будут два каталога:
-
build
— служебный каталог, который можно просто удалить. -
dist
— здесь будут все итоговые файлы, включая итоговый exe-файл.
Нетрудно заметить, что размер итогового дистрибутива достаточно большой: 25-30Мб. Это из-за того, что PyInstaller в дистрибутив включает полный комплект самого Python и необходимых библиотек. Исходный код вашего проекта будет скомпилирован в exe-файл, которому будут нужны дополнительные dll-библиотеки. Поэтому и такой размер.
После этого запустите exe-файл и убедитесь, что всё корректно работает.
Теперь можно сделать так, чтобы на выходе получился один-единственный exe-файл. Для этого используйте следующую команду (предварительно удалите build
и dist
):
pyinstaller --onefile taro.py
В каталоге dist
появится итоговый exe-файл. Но нужно учитывать, что этот файл по сути самораспаковывающийся архив (примерно как в RAR-упаковщике). То есть когда вы запустите такой файл, то в каталоге temp
программа распакует все остальные файлы (dll, exe и прочие) и уже будет выполняться оттуда. Временные каталог будет иметь имя _meiЦИФРЫ
. После завершения работы программы, он будет автоматически удалён.
Таким образом, если вы делаете единый exe-файл, то учитывайте, что его запуск будет дольше, чем уже распакованный. Разница может быть несколько секунд (до десятка) — это зависит от размера проекта и мощности компьютера.
Использование UPX
Кто занимается написанием программ на других языках, прекрасно знает UPX — это упаковщик exe-файлов. То есть скармливаете ему какой-нибудь экзешник и на выходе получаете такой же, только меньшего размера.
Сложность использования UPX в том, что на него ругаются (на сам момент упаковки) многие антивирусные программы, включая и защитник Windows. Поэтому с ним нужно приноровиться работать.
Хорошая новость в том, что PyInstaller может использовать UPX по умолчанию. Для этого нужно скачать подходящий дистрибутив UPX (для вашей операционной системы), взять из него файл upx.exe
и скопировать его например в каталог windows
. Тогда он будет доступен с любого места.
Дальше используете PyInstaller точно также, только теперь он сам найдёт UPX и выполнит сжатие так, что нам не нужно будет об этом беспокоиться.
В итоге размер exe-файла станет меньше на 20-30% — это экономия в несколько мегабайт.
Минус использования UPX в том, что он должен распаковать исходный файл, поэтому запуск программы будет ещё дольше. Насколько это критично — нужно смотреть на реальном проекте. Если это несколько секунд (скажем до 10-20), то это может оказаться приемлемым.
Отдельно замечу, что проверять нужно на слабых компах. У программистов обычно сильные компьютеры, там и так всё летает.
UPX часто используется не только как упаковщик, но и для защиты программ от взлома.
Скажем так — идеальной защиты нет, но UPX создаёт дополнительные барьеры, что усложняет взлом программ.
Если вы хотите не использовать UPX (но не удалять его из системы), то используйте ключ --noupx
:
pyinstaller --onefile --noupx taro.py
Дополнительные файлы проекта
Часто программа использует дополнительные файлы. Поскольку PyInstaller создаёт самораспаковывающийся exe-файл, то нужно именно в него добавить дополнительные файлы. Для этого используется отдельный параметр --add-data
:
pyinstaller --onefile --add-data "cards.txt;." taro.py
Обратите внимание на символы «;» и «.» в конце. Первый символ служит разделителем нескольких файлов. Точка, если я верно понял — указывает на текущий каталог. Если их убрать, то PyInstaller будет ругаться на неверный формат.
Защита программы средствами Python
Если пользователь готов отдельно установить Python (и сторонние модули), то всё-равно можно отказаться от исходных файлов программы.
Суть в том, что любая программа Python изначально компилируется в байт-код, который непосредственно и выполняется. Сам Python использует язык C (CPython), поэтому он готовит для него байт-код, который можно сохранить в отдельный файл.
Модули вообще автоматом всегда компилируются в каталог проекта __pycache__
.
Таким образом пользователь может получить только скомпилированные pyc-файлы без исходных. Делается это достаточно просто:
python -m compileall .
Появятся pyc-файлы, которые будут работать точно также, как и исходные.
Конечно такой подход не гарантирует, что pyc-файл нельзя раскодировать, но для этого придётся приложить усилия. Если вы используете последние версии Python, то это ещё больше усложнит задачу. В любом случае, если защита программы не является приоритетом, то использование pyc-файлов неплохой выбор для того, чтобы скрыть код от любопытных глаз.