Какие пакетные менеджеры используются в Python
Что проверяют
Следите ли вы за экосистемой, она заметно изменилась за пару лет, и различаете ли установщик, менеджер зависимостей и инструмент управления окружением. Следом спрашивают, чем лок-файл отличается от requirements.txt и как добиться воспроизводимой сборки.
Как отвечать
Разложите инструменты по назначению:
pip: штатный установщик, ставит из PyPI, из git и из локального каталога,-eдаёт редактируемую установку. С версии 20.3 у него резолвер с откатами, но дерево зависимостей он не фиксирует;venv: штатные изолированные окружения. Связкаpipплюсvenvэто минимум, доступный везде;uv: быстрый менеджер на Rust от Astral, заменяет связку pip, pip-tools и virtualenv. Командыuv venv,uv add,uv sync,uv run, свойuv.lock, умеет сам ставить нужную версию интерпретатора. Для новых проектов это выбор по умолчанию;- Poetry: зрелый менеджер зависимостей с
pyproject.toml,poetry.lockи сборкой пакета одной командой; - PDM и Hatch: то же поле, Hatch силён сборкой и матрицей окружений;
- pipenv: связка pip и virtualenv, встречается на унаследованных проектах;
- conda, mamba, pixi: нужны, когда зависимости бинарные: CUDA, MKL, компиляторы. Обычная история в машинном обучении;
- pipx: установка консольных утилит в отдельные окружения, у uv это
uv tool install.
Про файлы: метаданные проекта живут в pyproject.toml по PEP 621, python setup.py install устарел, сборка идёт через build, публикация через twine. Для повторяемости нужен лок-файл или как минимум pip-compile с хешами, а в 2025 приняли PEP 751 с единым форматом pylock.toml.
Где спотыкаются
Называют только pip и на вопрос про воспроизводимость отвечают «зафиксируем версии». Без хешей и полного дерева зависимостей сборка всё равно разъедется.
Считают pip freeze > requirements.txt лок-файлом. Он выгружает окружение целиком, смешивает прямые и транзитивные зависимости и зависит от платформы.
Ставят пакеты в системный интерпретатор. В свежих дистрибутивах это упирается в ошибку externally-managed-environment по PEP 668, и её обходят флагом --break-system-packages вместо того, чтобы создать окружение.