EMZETT.
Войти

uv, Poetry и управление проектами: создание современных проектов Python

Коротко: Современные проекты Python используют pyproject.toml, изолированные окружения и lock-файлы; инструменты вроде uv или Poetry управляют зависимостями, версиями Python и сборками быстрее и воспроизводимее, чем один pip.

Подробнее: Для небольших скриптов хватает pip install и requirements.txt. Для проектов с несколькими разработчиками, развёртываниями и тестами нужны определённые версии, отдельные окружения и lock-файлы.

Подробности

pyproject.toml

Центральный файл конфигурации (PEP 621):

[project]
name = "gamecatalog"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["fastapi>=0.110", "httpx"]
[dependency-groups]
dev = ["pytest", "mypy", "ruff"]
[tool.ruff]
line-length = 100

Содержит метаданные, зависимости, конфигурацию инструментов (ruff, pytest, mypy, black). Заменяет setup.py/setup.cfg. Бэкенды сборки: hatchling, setuptools, poetry-core.

uv

uv (Astral, написан на Rust): чрезвычайно быстрый менеджер пакетов и инструмент проектов.

uv init gamecatalog && cd gamecatalog
uv add fastapi httpx            # зависимость + uv.lock
uv add --dev pytest ruff mypy
uv run pytest                    # выполняется в окружении проекта
uv python install 3.12           # управление версией Python
uv sync                          # установить точно по lock-файлу
uvx ruff check .                 # однократно запустить инструмент без установки

Создаёт .venv, записывает uv.lock (воспроизводимо). Совместим с pip (uv pip install).

Poetry и другие

  • Poetry: разрешение зависимостей, poetry.lock, управление virtualenv, сборка/публикация (poetry add, poetry install, poetry run).
  • PDM, Hatch, Rye (→ uv): схожие подходы.
  • pip + venv: основа (python -m venv .venv, pip install -r requirements.txt); pip freeze замораживает, pip-tools (pip-compile) создаёт lock-файлы.
  • conda/mamba для научных пакетов (нативные библиотеки, CUDA).
  • pipx для CLI-инструментов (устанавливаются изолированно).
  • Docker: зафиксировать окружение в контейнере.

Хорошая практика

  • Одно окружение на проект, не коммитьте .venv (.gitignore), коммитьте lock-файл.
  • Зафиксируйте версию Python (.python-version, requires-python).
  • Отделяйте зависимости для разработки.
  • Обновления: Dependabot/Renovate, uv lock --upgrade, читайте журналы изменений (SemVer).
  • Безопасность: pip-audit/uv pip audit, проверяйте источники (typosquatting, цепочка поставок), хэши (--require-hashes).
  • Линтер/форматировщик: ruff (в значительной мере заменяет flake8/isort/black), хуки pre-commit.
  • Структура: раскладка src/, тесты в tests/, точка входа CLI [project.scripts].
  • Обучение/проект: README с шагами установки (uv sync && uv run pytest) для проверяющих.

См. также: Семантическое версионирование, Conda и Jupyter