Сайт вебмастера

Как сделать .exe файл из программы на Python

10-03-2023Reading time ~ 4 min.Python 3757

Создание исполняемого .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-файлов неплохой выбор для того, чтобы скрыть код от любопытных глаз.

Related Posts