Гайд - Компиляции на python, как и зачем | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой уникальный скрипт?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

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

Lanutrix

Бот
Автор темы
9 Фев 2023
44
131
0
Доброго времени суток, сразу скажу, что новичок, как на этом форуме, так и в роли автора статьи. Жду с нетерпением ваших комментариев о количестве моих грамматических ошибок. Заранее извиняйте.

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

Или все-таки можешь?

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

:foxДля тех, кто ещё не зарегистрировался:fox

Пойдëм по порядку, cx_Freeze, что это за зверь такой. На самом деле, весьма интересный. Давай глянем код, а потом разберëмся с ним.
[REACTS=1]
Python:
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
[/REACTS]

А на этом моя статья подходит к концу. Всем добра и только хорошего кода.
 
Последнее редактирование:
Like
  • 9
Реакции: 8 users

Pro100_Dev

Джун
10 Янв 2023
3
0
0
Прога скомпилированная через nuitka не запускается на другом компе. Пишет что не найдена библиотека, если не ошибаюсь python32.dll. Как пофиксить?
 

Lanutrix

Бот
Автор темы
9 Фев 2023
44
131
0
Как я понимаю ты используешь python3.2. Данной версии нет в списке полностью поддерживаемых
1685217175183
Документация

Я бы советовал тебе обновиться до python3.8, она поддерживает win7-win11, сам использую именно эту версию и nuitka настраивал на ней.
 
Последнее редактирование:

NiggaByte+REP

so black
hehe
8 Янв 2023
1,182
2,929
113
про это не знал) годно
  • ordered-set - для применения оптимизаций Nuitka.
  • standard - для уменьшения веса скомпилированного ехе, при компиляции в один файл
 
Активность:
Пока что здесь никого нет