Работа с зависимостями в Python

Работа с зависимостями в Python #

Документ посвящён необходимым знаниям, относящимся к работе с зависимостями в языке програмирования Python.

Для работы с зависимостями необходимо разобрать следующие темы: виртуальное окружение, прямые и транзитивные зависимости, группы зависимостей, инструменты (пакетные менеджеры).

Виртуальное окружение #

При установке сторонних библиотек глобально могут возникнуть проблемы: конфликты между разными проектами, сложно управлять зависимостями, а также можем случайно изменить системные зависимости, что может привести к проблемам при запуске других Python приложений.

Для решения данных проблем и используется виртуальное окружения - каждое из которых изолировано от других. Рекомендуется практически всегда использовать виртуальное окружение для установки зависимостей.

В Python есть пакет для управления виртуальными зависимостями - venv (добавлен в версию 3.3), но также есть и сторонние инструменты - virtualenv, poetry

Что нужно знать, где почитать:

Прямые и транзитивные зависимости #

Нужно разделять зависимости на два типа:

  1. Логические (прямые) - те зависимости, которые мы ставим через pip <package_name> например: aiogram
  2. Транзитивные - те зависимости, от которых зависит логические зависиости. (все зависимости aiogram, а также зависимости зависимостей aiogram и так далее)

Обычно мы хотим иметь отдельно список наших логических зависимостей и полный список зависимостей. Второй список полезен для воспроизводимых сборок нашего окружения. Первый список нам нужен для того, чтобы управлять логическими зависимостями, которые используются в нашем проекте, а также могут быть использованы для восстановления полного списка зависимостей.

Запись логических зависимостей можно вести в ручную: при установке библитеки вносить ее в список вместе с используемой версией (версии указываем). Этот процесс автоматизирован в некоторых пакетных менеджерах.

Почитать - https://blog.ometer.com/2017/01/10/dear-package-managers-dependency-resolution-results-should-be-in-version-control/

Группы зависимостей #

На практике разные зависимости в проектах нужны для различных сценариев использования:

  1. Эксплуатация приложения
  2. Тестирование приложения
  3. Инструменты для разработке
  4. Создание документации

Зависиомости можно делить на группые, чтобы устанавливать только те из них, которые необходимы для конкретного случая.

Почитать - PEP 735.

Пакетные менеджеры #

В Python есть встроенный пакетный менеджер - pip. Он используется в реальных проектах, но большинство работы со списками (прямые/транзитвные, группы) приходятся брать на себя программисту.

Поэтому, Python сообщество развивает сторонние решения, которые расширяют и дополняют функционал pip:

Poetry - Python packaging and dependency management made easy.

Одно из самых популярных решений на данный момент. Имеет фичи, которые были упомянуты выше:

  • Управление списками зависимостей (прямые/полный список зависимостей с их версиями, группы)
  • Управление виртуальным окружением
  • Управление сборкой и публикацией библиотек

Другие пакетные менеджеры - uv, pip-tools, Pipenv.

В Python большой выбор пакетных менеджеров каждый из которых имеет свои плюсы и минусы.

На практике, рекомендую начинать с pip, написать с ним 1-2 проекта, позднее добавить Poetry.

Полезные материалы #