Компиляции на python, как и зачем
Доброго времени суток, сразу скажу, что новичок, как на этом форуме, так и в роли автора статьи. Жду с нетерпением ваших комментариев о количестве моих грамматических ошибок. Заранее извиняйте.
Итак, Python на сегодняшний день один из самых популярных ЯПов и писать на нём умеет каждый третий школьник. Но как мы все знаем у него есть несколько огрех, таких как скорость и интерпретируемость. Если коротко, то ты не можешь взять свой python скрипт и сделать из него exe файл.
Или все-таки можешь?
Рассмотрим несколько инструментов. Сразу оговорю, что такой кал, как Pyinstaller или PyAutoExe сразу идут лесом. Вместо этих популярных, но мусорных решений хочу предложить нечто реально годное, а именно cx_Freeze и Nuitka. Думаю ты натыкался на сведения о них. Так вот, я собрал все эти кусочки из интернета в одну статью. Приступим же!
https://vipadmin.club/bot-redirect?https://endway.org/?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
А на этом моя статья подходит к концу. Всем добра и только хорошего кода.