Почему использовать poetry вместо pip
Что проверяют
Понимаете ли вы разницу между установщиком пакетов и менеджером проекта и не повторяете ли лозунги семилетней давности. Следом обычно спрашивают, что именно даёт lock-файл и почему pip freeze > requirements.txt это не то же самое.
Как отвечать
Сразу поправьте постановку вопроса: pip это установщик пакетов, Poetry это менеджер проекта, который поверх установки берёт на себя разрешение зависимостей, фиксацию версий, окружение и сборку. Сравнивать Poetry честнее с uv, pdm и pip-tools.
Что даёт Poetry:
poetry.lock: полное дерево зависимостей с точными версиями и хэшами, одинаковое на машине разработчика и в CI.pip freezeфиксирует лишь то, что оказалось установлено, на одной платформе и одной версии Python;- резолвер: подбирает совместимый набор версий целиком, а не ставит пакеты по очереди, затирая уже установленное;
- группы зависимостей: dev, test, docs ставятся выборочно (
poetry install --without dev); pyproject.tomlкак единственный файл описания плюс своё окружение на проект. С Poetry 2.0 поддерживается стандартная секция[project]из PEP 621, а не только[tool.poetry].
Назовите и обратную сторону, иначе ответ звучит как реклама: резолвер Poetry медленный, установка пакетов из отдельных индексов (классика это сборки PyTorch под конкретную CUDA) настраивается неочевидно, а в контейнере лишний инструмент часто не нужен.
Где pip достаточно: докер-образ с готовым списком и --require-hashes, разовый скрипт, чужой CI. Добавьте, что pip не стоял на месте: он ставит проекты из pyproject.toml, умеет группы зависимостей из PEP 735, а сам формат lock-файла стандартизован в PEP 751.
Где спотыкаются
Говорят, что Poetry быстрее pip. По скорости он обычно проигрывает, его выигрыш в воспроизводимости, а быстрый инструмент сегодня это uv.
Не различают pyproject.toml и poetry.lock, объясняя воспроизводимость первым. В нём диапазоны версий, точные версии только в lock, и в репозиторий приложения он должен коммититься.
Переносят подход приложения на библиотеку. Библиотеке нужны широкие диапазоны версий, а lock-файл там нужен ради собственного CI, а не как ограничение для пользователей.