Как управлять зависимостями в проекте на Python

«Как управлять зависимостями в проекте на Python» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. requirements.txt (стандартный подход) Простой текстовый файл, перечисляющий пакеты. Создается командой pip freeze > requirements.txt.

    • Плюсы: Простота, поддерживается всеми инструментами.
    • Минусы: Не разделяет основные и dev-зависимости, не гарантирует детерминированную установку (установка requests>=2.25.0 сегодня и через год может дать разные результаты).
    # requirements.txt
    flask==2.0.1
    requests>=2.25.0
  2. Pipenv (улучшенный подход) Сочетает управление пакетами (Pipfile) и виртуальными окружениями. Создает Pipfile.lock для фиксации точных версий всех зависимостей, обеспечивая детерминированные сборки.

    • Плюсы: Автоматическое управление virtualenv, lock-файл.
    • Минусы: Может быть медленнее других инструментов.
    # Установить основную зависимость
    pipenv install flask
    
    # Установить dev-зависимость
    pipenv install --dev pytest
  3. Poetry (современный стандарт) Мощный инструмент, использующий pyproject.toml для метаданных проекта и зависимостей. Генерирует poetry.lock для строгой фиксации версий.

    • Плюсы: Надежное разрешение зависимостей, удобное управление проектом и публикация пакетов, разделение зависимостей.
    • Минусы: Более высокий порог входа для новичков.
    # Добавить основную зависимость
    poetry add flask
    
    # Добавить dev-зависимость
    poetry add --dev pytest

Рекомендации:

  • Для новых проектов: Используйте Poetry как наиболее надежный и функциональный инструмент.
  • Для legacy или простых скриптов: Достаточно requirements.txt, но обязательно фиксируйте версии с помощью pip freeze.
  • Ключевая практика: Всегда используйте lock-файлы (poetry.lock, Pipfile.lock) или requirements.txt с зафиксированными версиями (==) для обеспечения воспроизводимости сборок в CI/CD и на машинах других разработчиков.