При разработке на Python мы часто используем десятки внешних библиотек — для работы с API, тестирования, работы с датой и временем, логирования и прочего. Неконтролируемое управление зависимостями быстро приводит к конфликтам, «битым» окружениям и неработающему коду даже на соседнем компьютере. Ниже — как грамотно организовать работу с зависимостями, чтобы проекты были надёжными, воспроизводимыми и удобными для команды.
Базовые инструменты управления зависимостями
Python предлагает несколько способов работы с внешними библиотеками. Самые привычные — pip и requirements.txt, но есть и более продвинутые решения (poetry, pip-tools).
pip и requirements.txt
-
pip — базовый менеджер пакетов Python. Умеет устанавливать, удалять, обновлять и показывать пакеты (
pip install package). -
requirements.txt — файл со списком зависимостей и их версиями.
Пример:
flask==2.3.2
requests>=2.28.0,<2.30.0
pytest
Практический подход:
-
Всегда явно указывайте зависимости в
requirements.txt. -
Закрепляйте версии:
package==1.2.3или диапазон>=1.2.3,<2.0.0. -
После обновления пакетов обновляйте файл:
pip freeze > requirements.txt(или используйте pip-tools — см. ниже).
Изоляция окружения: virtualenv и venv
-
venv (есть в Python 3.3+) — создаёт отдельное окружение для проекта.
-
Установленные внутри библиотеки не конфликтуют с другими проектами.
Создание и активация:
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activate
Современные инструменты: pip-tools и poetry
Когда проект растёт, базовых инструментов уже недостаточно. Тут приходят pip-tools и poetry.
Они дают:
-
стабильность и предсказуемость зависимостей
-
удобное обновление
-
контроль транзитивных зависимостей
pip-tools: контроль без боли
pip-tools помогает разделить «что ты хочешь» и «что реально ставится».
Как работает:
-
Пишешь основные зависимости в
requirements.in:flask pytest requests -
Генерируешь итоговый файл:
pip-compile requirements.in -
Получаешь
requirements.txtс зафиксированными версиями всех зависимостей (включая вложенные). -
Установка:
pip install -r requirements.txt
Плюсы:
-
Чистый список основных зависимостей
-
Полный контроль версий
-
Меньше конфликтов
Poetry: «всё в одном»
Poetry — это уже уровень “сделай нормально и забудь”.
Плюсы:
-
Один файл —
pyproject.tomlвместо зоопарка файлов -
Автоматическая изоляция окружения
-
Разделение зависимостей на:
-
основные
-
dev (тесты, линтеры и т.д.)
-
-
Удобное управление и обновление
Типичный workflow:
poetry init
poetry add flask
poetry add --dev pytest
poetry shell
poetry update
Если коротко:
pip + requirements = базово
pip-tools = контроль
poetry = комфорт и масштаб
Дополнительные практики
Чистота зависимостей
-
Удаляйте ненужные библиотеки (меньше мусора — меньше проблем)
-
Регулярно обновляйте зависимости
-
После обновлений всегда прогоняйте тесты
Минимизация конфликтов
-
Используйте диапазоны версий
-
Проверяйте транзитивные зависимости
-
При проблемах — пересобирайте зависимости (pip-tools решает 80% боли)
Версионирование
-
Храните в git:
-
requirements.txt -
pyproject.toml -
poetry.lock
-
-
Не храните:
-
venv/ -
.venv/
-
Добавьте их в .gitignore, иначе репозиторий превратится в помойку быстрее, чем ты скажешь "pip install".
Заключение
Контроль зависимостей — это не «опционально», это база. Если забить — рано или поздно словишь классическое:
"у меня работает, у тебя нет — значит у тебя руки кривые"
Хотя проблема в окружении 🙂
Минимальный сетап:
-
venvдля изоляции -
фиксация зависимостей
-
контроль версий
Продвинутый сетап:
-
pip-toolsилиpoetry -
CI с тестами
-
регулярные обновления
Сделаешь это один раз нормально — и сэкономишь себе часы (а иногда и дни) жизни.
