← Назад к вопросам
В чем разница между poetry и requirements.txt?
2.0 Middle🔥 141 комментариев
#DevOps и инфраструктура#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Poetry и requirements.txt: выбор инструмента управления зависимостями
Poetry и requirements.txt — два разных подхода к управлению зависимостями в Python. Выбор между ними зависит от типа проекта, требований к reproducibility и команды разработчиков.
1. Что это такое?
requirements.txt
# Простой текстовый файл со списком зависимостей
requests==2.31.0
Django==4.2.5
celery>=5.3,<6.0
pytest-cov
Характеристики:
- Стандарт де-факто (встроен в pip)
- Простой формат: пакет==версия
- Плоская структура (прямые и транзитивные зависимости в одном списке)
- Нет разделения на dev/prod зависимости в одном файле
- Нет механизма lock-файла в стандарте
Poetry
# pyproject.toml - конфиг проекта
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "My awesome project"
authors = ["John Doe <john@example.com>"]
[tool.poetry.dependencies]
python = "^3.10"
requests = "^2.31.0"
Django = "^4.2"
[tool.poetry.group.dev.dependencies]
pytest = "^7.4"
black = "^23.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Характеристики:
- Современный менеджер зависимостей и сборки
- TOML конфигурация (более структурированно)
- Автоматическое разделение dev/prod зависимостей
- Генерирует poetry.lock для reproducible установок
- Встроенная поддержка сборки и публикации пакетов
- Семантическое версионирование (^, ~)
2. Основные различия
Управление версионированием
# requirements.txt: жёсткие версии
Django==4.2.5 # Точная версия
requests>=2.28.0 # Минимальная версия
celery<5.0 # Максимальная версия (исключена)
# requirements.txt: проблема
# Никого не гарантирует, что у всех одинаковые версии подзависимостей
# На ПК разработчика может быть requests 2.31.0
# На CI может установиться requests 2.32.0
# В продакшене может быть 2.30.0
# Poetry: семантическое версионирование
requests = "^2.31.0" # 2.31.0 до 3.0.0 (мажор меняется)
Django = "~4.2" # 4.2.x (от 4.2.0 до 4.3.0)
# Poetry.lock: идентичные версии везде
# Каждый член команды, CI и продакшен используют ровно те же версии
Reproducible Builds (Воспроизводимые сборки)
# requirements.txt: ПРОБЛЕМА
# pip install -r requirements.txt на разных временах может дать разные версии
pip install -r requirements.txt # День 1: requests 2.31.0, urllib3 2.0.0
pip install -r requirements.txt # День 7: requests 2.31.0, urllib3 2.1.0
# Транзитивная зависимость urllib3 обновилась, тесты падают
# Poetry: РЕШЕНИЕ
poetry install
# Использует poetry.lock, все версии фиксированы
# Добавить новую зависимость:
poetry add requests
# poetry.lock обновляется автоматически, коммитим в git
# Другой разработчик: poetry install = абсолютно идентичные версии
3. Структура зависимостей
requirements.txt: Плоская структура
# requirements/base.txt
Django==4.2.5
requests==2.31.0
celery==5.3.0
# requirements/dev.txt
-r base.txt
pytest==7.4.0
black==23.0.0
flake8==6.0.0
# requirements/prod.txt
-r base.txt
gunicorn==20.1.0
psycopg2==2.9.7
# Использование:
pip install -r requirements/dev.txt # Все dep для разработки
pip install -r requirements/prod.txt # Минимум для продакшена
Проблемы:
- Нужно вручную создавать несколько файлов
- Легко забыть обновить все файлы при изменении
- Транзитивные зависимости перепутываются
Poetry: Встроенное разделение
# pyproject.toml - один файл
[tool.poetry.dependencies]
python = "^3.10"
Django = "^4.2"
requests = "^2.31"
celery = "^5.3"
[tool.poetry.group.dev.dependencies]
pytest = "^7.4"
black = "^23.0"
flake8 = "^6.0"
[tool.poetry.group.prod.dependencies]
gunicorn = "^20.1"
psycopg2 = "^2.9"
# Установка
poetry install # Все, включая dev
poetry install --no-dev # Только production
poetry install --only main # Только основные (новый синтаксис)
poetry install --only prod # Prod-специфичные
4. Lock файлы
requirements.txt без lock
# Нужно вручную генерировать зависимости
pip freeze > requirements.txt
# requirements.txt
celery==5.3.1
click==8.1.0
kombu==5.3.2
prompt-toolkit==3.0.40
pytest==7.4.2
pytest-cov==4.1.0
pytest-mock==3.11.1
requests==2.31.0
urllib3==2.0.6
# Проблема: transitive deps смешаны с прямыми
# Неясно какие зависимости явные, какие автоматические
Poetry с poetry.lock
# poetry.lock генерируется автоматически
poetry add requests
# poetry.lock обновляется
# poetry.lock (сокращённо):
[[package]]
name = "requests"
version = "2.31.0"
description = "Python HTTP library"
requires_python = ">=3.7"
[[package]]
name = "urllib3"
version = "2.0.6"
description = "HTTP library with thread-safe connection pooling"
requires_python = ">=3.7"
# Poetry.lock сохраняет ВСЕ версии для полной reproducibility
# Коммитим в git: git commit poetry.lock
5. Пример проекта
Структура с requirements.txt
my-project/
├── requirements/
│ ├── base.txt
│ ├── dev.txt
│ ├── prod.txt
│ └── test.txt
├── setup.py
└── main.py
# Установка зависимостей: 3 команды
pip install --upgrade pip
pip install -r requirements/dev.txt
pip install -e . # для editable install
Структура с Poetry
my-project/
├── pyproject.toml
├── poetry.lock
├── src/
│ └── my_project/
│ └── __init__.py
└── tests/
└── test_main.py
# Установка зависимостей: 1 команда
poetry install
6. Практическое сравнение
Добавление новой зависимости
# requirements.txt
pip install new-package
pip freeze > requirements.txt
# Или вручную добавить в requirements.txt
# Потом обновить requirements/dev.txt, test.txt если нужна везде
# Poetry
poetry add new-package
# poetry.lock обновляется автоматически
# Готово!
# Для dev-only:
poetry add --group dev pytest
Обновление зависимостей
# requirements.txt
pip install --upgrade
pip freeze > requirements.txt
# Рисковано: может сломать совместимость
# Poetry
poetry update
# Уважает версионные ограничения в pyproject.toml
# Безопаснее: ~1.0 обновит до 1.9, не до 2.0
Сборка и публикация пакета
# requirements.txt + setup.py
setup.py sdist
twine upload dist/*
# Poetry (встроено)
poetry build
poetry publish
7. Когда использовать что?
| Критерий | requirements.txt | Poetry |
|---|---|---|
| Малый скрипт/PoC | ✅ Простой и быстрый | ❌ Overhead |
| Командный проект | ⚠️ Нужна дисциплина | ✅ Enforced правила |
| Публикуемый пакет | ❌ Нужна setup.py | ✅ Встроено |
| Reproducible builds | ❌ Сложно | ✅ Встроено |
| CI/CD pipeline | ⚠️ Нужна setup | ✅ Готово |
| Множество окружений | ❌ Нужны разные файлы | ✅ groups |
| Быстрое включение | ✅ 2 команды | ⚠️ Установка Poetry |
| Большой проект | ⚠️ Сложно масштабировать | ✅ Структурировано |
8. Миграция с requirements.txt на Poetry
# 1. Инициализируем Poetry
poetry init
# 2. Переносим зависимости
poetry add Django requests celery
poetry add --group dev pytest black flake8
# 3. Проверяем совместимость
poetry check
poetry lock
# 4. Удаляем старые файлы
rm -rf requirements/
rm setup.py setup.cfg
Резюме
- requirements.txt — простой, универсальный, требует дополнительных инструментов для reproducibility
- Poetry — современный, структурированный, встроенная reproducibility и сборка
- requirements.txt хорош для скриптов и простых проектов
- Poetry рекомендуется для команды, publishable пакетов и CI/CD
- Выбор за вами, но Poetry становится стандартом в 2024-2025 году