VIPAdmin / Разработка / Компиляции на python, как и зачем

Компиляции на python, как и зачем

ВАЖНО! рекомендуемый хостинг для сайта - PrivateAlps


Доброго времени суток, сразу скажу, что новичок, как на этом форуме, так и в роли автора статьи. Жду с нетерпением ваших комментариев о количестве моих грамматических ошибок. Заранее извиняйте.

Итак, Python на сегодняшний день один из самых популярных ЯПов и писать на нём умеет каждый третий школьник. Но как мы все знаем у него есть несколько огрех, таких как скорость и интерпретируемость. Если коротко, то ты не можешь взять свой python скрипт и сделать из него exe файл.

Или все-таки можешь?
Рассмотрим несколько инструментов. Сразу оговорю, что такой кал, как Pyinstaller или PyAutoExe сразу идут лесом. Вместо этих популярных, но мусорных решений хочу предложить нечто реально годное, а именно cx_Freeze и Nuitka. Думаю ты натыкался на сведения о них. Так вот, я собрал все эти кусочки из интернета в одну статью. Приступим же!

https://endway.su/?referrer=1347
Пойдëм по порядку, cx_Freeze, что это за зверь такой. На самом деле, весьма интересный. Давай глянем код, а потом разберëмся с ним.

from cx_Freeze import setup, Executable
import sys
sys.argv = [sys.argv[0], 'build']
full_path = 'D:/example/example.py'
namer = 'example'
base = 'console'
description = 'ОПИСАНИЕ ПРОЦЕССА'
version = '1.0'
build_options = {'packages': [], 'excludes': []}
executables = [
 Executable(full_path, base = base, targetName= namer + '.exe')
 ]
setup(name=namer,
 version=version,
 description=description,
 options={'build_exe': build_options},
 executables=executables)


Хм, что к чему? Всё просто! Для создания ехе из своего python скрипта нужно заполнить своими параметрами 5 переменных в коде выше.

  • full_path - полный путь но python скрипта
  • namer - название получаемого ехе файла
  • base - тип вашего приложения, консоль или графический интерфейс (console или win32gui)
  • description - имя процесса в диспетчере задач widows
  • version - версия вашего приложения


После запуска этого кода у вас будет папка с exe файлом вашего скрипта и дополнительные файлы, нужные для его работы.
Да, это очень тяжело назвать компиляцией, так как по сути происходит упаковка интерпретатора python, используемых библиотек и вашего исходного кода в одну папку для автономного использования. Всё бы было хорошо, если бы не несколько НО. Во-первых, мы получаем не 1 exe файл, а целую папку. Во-вторых, программы "скомпилированные" таким образом можно довольно просто декомпилировать и получить исходный код всего вашего проекта. Как это сделать? Распишу в следующих публикациях.

- Второго пациента на анатомический стол!
- Nuitka подана, сэр.
Итак, Nuitka использует совершенно другой подход и в корне отличается от cx_Freeze. Она действительно компилирует ваш код на python. Как-же? Оно перегоняет код установленных библиотек и исходный код вашего проекта в Си-код, а после компилирует его при помощи gcc (можно переключить на clang), на выходе мы можем получить как папку, так и 1 exe файл.

Приступим. Для начала нужно скачать несколько библиотек:
  • Nuitka - ясно для чего.
  • ordered-set - для применения оптимизаций Nuitka.
  • standard - для уменьшения веса скомпилированного ехе, при компиляции в один файл.


При первом запуске Nuitka попросит разрешение на скачивания архива с компилятором и последующую распаковка, просто нужно будет дважды ввести
Y

Всё что нужно мы установили, давай попробуем, что-нибудь скомпилировать! Для этого тебе нужно будет открыть командную строку, не пугайся.
Управление сборкой происходит при помощи флагов.

nuitka --onefile --nofollow-imports --static-libpython=no --remove-output --no-pyi-file --output-dir=build --jobs=8 example.py


рассмотрим подробнее ключи:
  • --onefile - ключ для компиляции одного бинарного файла;
  • --nofollow-imports - не компилирует зависимые модули;
  • --static-libpython=no - не нужно ничего брать из conda;
  • --remove-output - удаляет после работы сгенерированные из python-модуля Си-файлы;
  • --no-pyi-file - после компиляции создаётся текстовый файл .pyi, в котором имеется информация о структуре исходного python-модуля, он нам тоже не нужен;
  • --output-dir=build - сохраняет бинарный модуль в папке build;
  • --jobs=8 - компилирует в 8 потоков.


Если же вы хотите создать gui приложение или просто без отображения консоли, то добавьте флаг
--disable-console
. Графический интерфейс у тебя скорее всего на tk-inter или pyqt, то нужно добавить флаг
--enable-plugin=tk-inter
.

nuitka --onefile --nofollow-imports --static-libpython=no --remove-output --no-pyi-file --output-dir=build --jobs=8 --disable-console --enable-plugin=tk-inter example.py


Хм, уже получилось довольно неплохо: у нас есть GUI программа, написанная на python, скомпилированная в один ехе и работающая автономно от установленного python и дополнительных файлов. Можно отсылать другу, пусть любуется!
Чего-то не хватает... точно, иконка. Какое нынче приложение публикуют без иконки? Не переживай, сейчас всё будет! Для этого просто добавь флаг:
--windows-icon-from-ico=path_icon
.

В качестве иконки вы можете использовать файл как png, так и ico. И по итогу, финальная команда для компиляции будет выглядеть как:

nuitka --onefile --nofollow-imports --static-libpython=no --remove-output --no-pyi-file --output-dir=build --jobs=8 --disable-console --enable-plugin=tk-inter --windows-icon-from-ico=your-icon.ico example.py


Ура, теперь у тебя есть крутая, скомпилированная GUI программа с нереально красивой иконкой, которую ты сам накалякал в paint. Скорее отсылай еë своему другу, не забыв вшить туда вирус, разумеется.
В общем и целом, я поведал всё, что знал. Прочитать про более тонкую настройку, под свои цели и задачи, ты можешь введя в командной строке
nuitka --help


А на этом моя статья подходит к концу. Всем добра и только хорошего кода.

Компиляции на python, как и зачем

11-02-2024, 08:00 .zip

Скачать

Отзывы (0)