Работа с зависимостями в Python #
Документ посвящён необходимым знаниям, относящимся к работе с зависимостями в языке програмирования Python.
Для работы с зависимостями необходимо разобрать следующие темы: виртуальное окружение, прямые и транзитивные зависимости, группы зависимостей, инструменты (пакетные менеджеры).
Виртуальное окружение #
При установке сторонних библиотек глобально могут возникнуть проблемы: конфликты между разными проектами, сложно управлять зависимостями, а также можем случайно изменить системные зависимости, что может привести к проблемам при запуске других Python приложений.
Для решения данных проблем и используется виртуальное окружения - каждое из которых изолировано от других. Рекомендуется практически всегда использовать виртуальное окружение для установки зависимостей.
В Python есть пакет для управления виртуальными зависимостями - venv (добавлен в версию 3.3), но также есть и сторонние инструменты - virtualenv, poetry
Что нужно знать, где почитать:
- Официальный туториал по созданию и работы с venv creating-virtual-environments
- Туториал на ArchWiki
- Документация venv
- Пост на эту тему
- Практика - использование в проектах
Прямые и транзитивные зависимости #
Нужно разделять зависимости на два типа:
- Логические (прямые) - те зависимости, которые мы ставим через
pip <package_name>
например:aiogram
- Транзитивные - те зависимости, от которых зависит логические зависиости. (все зависимости aiogram, а также зависимости зависимостей aiogram и так далее)
Обычно мы хотим иметь отдельно список наших логических зависимостей и полный список зависимостей. Второй список полезен для воспроизводимых сборок нашего окружения. Первый список нам нужен для того, чтобы управлять логическими зависимостями, которые используются в нашем проекте, а также могут быть использованы для восстановления полного списка зависимостей.
Запись логических зависимостей можно вести в ручную: при установке библитеки вносить ее в список вместе с используемой версией (версии указываем). Этот процесс автоматизирован в некоторых пакетных менеджерах.
Группы зависимостей #
На практике разные зависимости в проектах нужны для различных сценариев использования:
- Эксплуатация приложения
- Тестирование приложения
- Инструменты для разработке
- Создание документации
Зависиомости можно делить на группые, чтобы устанавливать только те из них, которые необходимы для конкретного случая.
Почитать - PEP 735.
Пакетные менеджеры #
В Python есть встроенный пакетный менеджер - pip. Он используется в реальных проектах, но большинство работы со списками (прямые/транзитвные, группы) приходятся брать на себя программисту.
Поэтому, Python сообщество развивает сторонние решения, которые расширяют и дополняют функционал pip:
Poetry - Python packaging and dependency management made easy.
Одно из самых популярных решений на данный момент. Имеет фичи, которые были упомянуты выше:
- Управление списками зависимостей (прямые/полный список зависимостей с их версиями, группы)
- Управление виртуальным окружением
- Управление сборкой и публикацией библиотек
Другие пакетные менеджеры - uv, pip-tools, Pipenv.
В Python большой выбор пакетных менеджеров каждый из которых имеет свои плюсы и минусы.
На практике, рекомендую начинать с pip, написать с ним 1-2 проекта, позднее добавить Poetry.
Полезные материалы #
- https://pip.pypa.io/en/stable/
- https://pythonspeed.com/articles/pipenv-docker/
- https://pythonspeed.com/articles/poetry-vs-docker-caching/
- https://pythonspeed.com/articles/activate-virtualenv-dockerfile/
- https://ritza.co/articles/gen-articles/pipenv-vs-virtualenv-vs-poetry-vs-pyenv-vs-pip/
- Практика - проекты роадмапа с 4 по 7