Почему сложно создавать автономные Python-приложения
Вы тратите недели на создание полезного инструмента на Python. На вашем компьютере он работает идеально. Вы пытаетесь поделиться им с коллегой, но ничего не получается, потому что у него не установлен Python.
Это распространенная проблема. Упаковать Python в один файл, который будет работать везде, — задача непростая. И дело не только в отсутствии файла requirements.
Проблема кроется в самом принципе работы Python.
Python — это динамический язык. Он принимает множество решений непосредственно во время выполнения программы. Он может импортировать библиотеки «на лету». Он может изменять логику работы функций прямо в процессе их выполнения.
Компилируемые языки, такие как Go или Rust, определяют всё еще до запуска программы. Они удаляют неиспользуемый код, чтобы создавать компактные и быстрые файлы.
Python так не может. Вы не можете легко предсказать, какие части среды выполнения (runtime) понадобятся вашему коду. Чтобы гарантировать работоспособность, вам приходится включать в сборку всю среду выполнения Python.
Это приводит к проблеме библиотек.
В других языках компиляторы используют tree-shaking, чтобы минимизировать размер файлов. Python не может этого сделать. Вам приходится включать каждую зависимость и каждую подзависимость. Вы также должны включать скомпилированные бинарные файлы. В итоге ваш маленький скрипт превращается в пакет весом 300 МБ.
У вас есть три основных варианта:
- Требовать наличия Python на целевой машине. Это подходит для разработчиков, но не подходит для обычных пользователей.
- Упаковывать интерпретатор. Такие инструменты, как PyInstaller или Nuitka, включают среду выполнения в ваше приложение. PyInstaller очень популярен. Nuitka конвертирует ваш код в C для повышения скорости.
- Использовать Docker. Это обеспечивает полную надежность за счет включения целого уровня операционной системы. Это отлично работает для серверов, но создает тяжелые файлы.
Новые инструменты, такие как PyApp, предлагают компромиссный вариант. Они используют небольшой лаунчер, который скачивает нужную версию Python за вас.
Как выбрать:
• Для технических команд: используйте виртуальное окружение и файл requirements. • Для не-разработчиков: используйте PyInstaller. Это самый проверенный метод. • Для серверов и конвейеров данных: используйте Docker. Здесь надежность важнее размера файла. • Для десктопных приложений, где важна скорость: используйте Nuitka.
Python не собирается менять свою природу, чтобы решить эту проблему. Язык остается динамическим. Нам придется полагаться на более совершенные инструменты, чтобы преодолеть этот разрыв.
Источник: https://dev.to/azadarjoe/why-standalone-python-apps-are-so-hard-to-build-3g31