Как вы управляете зависимостями и окружениями в Python-проекте?
Короткий ответ
- Виртуальное окружение изолирует зависимости проекта
- pyproject.toml — современный стандарт описания проекта
- Прямые зависимости и lock-файл — разные вещи
- Lock фиксирует точные версии для воспроизводимости
- Инструменты: pip + venv, poetry, uv, pip-tools
- Dev-зависимости отделяют от продакшен-зависимостей
Изоляция через виртуальные окружения плюс lock-файл с точными версиями дают воспроизводимые сборки, а pyproject.toml — единый стандарт описания проекта.
Как сказать вслух
пример ответаНа каждый проект я создаю виртуальное окружение, чтобы зависимости не конфликтовали между проектами и с системным Python. Прямые зависимости с диапазонами версий описываются в pyproject.toml, а точные версии всего дерева фиксирует lock-файл — именно он гарантирует, что на CI и у коллег установится ровно то же самое. Сейчас я чаще всего использую uv или poetry: они делают и окружение, и резолвинг, и lock одной командой.
Подробный ответ
Основной ответ
Виртуальное окружение (venv) — каталог со своим интерпретатором и site-packages, изолирующий проект. Декларация проекта стандартизована в pyproject.toml (PEP 621): имя, версия, зависимости с диапазонами (например, httpx>=0.27). Важно различать прямые зависимости и зафиксированный срез всего дерева: lock-файл (poetry.lock, uv.lock, requirements.txt из pip-compile) хранит точные версии и хеши, обеспечивая воспроизводимость на CI и в Docker. Инструменты: связка python -m venv + pip — минимум; poetry и uv добавляют резолвер, lock и управление окружением, причём uv написан на Rust и на порядок быстрее. Dev-зависимости (pytest, ruff, mypy) выносят в отдельную группу, чтобы не тащить их в прод-образ.
Ключевые моменты
- Зачем изоляция. Два проекта с разными версиями одной библиотеки не должны мешать друг другу и системным пакетам.
- Диапазоны против lock. В pyproject — совместимые диапазоны, в lock — точные версии с хешами; обновление lock — осознанное действие.
- Выбор инструмента. pip+venv достаточно для простых случаев; uv/poetry дают скорость, резолвер и единый workflow.
- CI и Docker. Установка строго из lock-файла (poetry install, uv sync, pip install -r) делает сборки повторяемыми.
Практический контекст
Вопрос проверяет базовую гигиену разработчика: сталкивался ли кандидат с «у меня локально работает», конфликтами версий и сборкой Docker-образов. Хорошо упомянуть фиксацию версии самого Python (.python-version), отдельные dev-группы и регулярное обновление зависимостей с прогоном тестов. Для junior достаточно уверенного владения venv и pip, знание uv/poetry — плюс.
Частые ошибки
- Ставят пакеты в системный Python и ловят конфликты между проектами
- Не отличают requirements с диапазонами от lock-файла с точными версиями
- Коммитят само виртуальное окружение в git вместо lock-файла