uv (менеджер пакетов)
| Тип | менеджер пакетов и проектов |
|---|---|
| Разработчик | Astral (Чарли Марш) |
| Первый выпуск | февраль 2024 |
| Написан на | Rust |
| Заменяет | pip, pip-tools, virtualenv, pipx, pyenv, частично Poetry |
| Файл блокировки | uv.lock |
| Лицензия | MIT / Apache 2.0 |
| Сайт | docs.astral.sh/uv |
uv — менеджер пакетов и проектов для Python, написанный на Rust компанией Astral. Он объединяет в одном исполняемом файле функции нескольких инструментов: установщика pip, создания виртуальных окружений, фиксации зависимостей, установки консольных утилит и управления версиями самого Python. Главная отличительная черта — скорость: по замерам разработчиков, установка зависимостей выполняется в 10–100 раз быстрее, чем у pip.[2]
История
Компания Astral, основанная Чарли Маршем, стала известна линтером Ruff, тоже написанным на Rust. В феврале 2024 года она выпустила uv как быструю замену pip и pip-tools с совместимым интерфейсом uv pip.[2] В августе того же года uv превратился в полноценный менеджер проектов: появились команды uv init, uv add, uv run, кроссплатформенный файл блокировки uv.lock, установка версий Python и запуск утилит через uvx.[3] Инструмент быстро набрал популярность и стал одним из самых используемых средств упаковки в экосистеме Python.
Почему быстрый
- реализация на Rust и параллельная загрузка и распаковка пакетов;
- глобальный кеш, из которого файлы в окружения ставятся жёсткими ссылками или копированием с поддержкой copy-on-write — повторная установка почти мгновенна;
- собственный резолвер зависимостей на основе алгоритма PubGrub;
- чтение метаданных пакета без скачивания всего архива, где это позволяет индекс.
Работа с проектом
uv init myapp && cd myapp # создать проект с pyproject.toml
uv add httpx "fastapi>=0.110" # добавить зависимости, обновить uv.lock
uv add --dev pytest ruff # зависимости для разработки
uv run python main.py # запустить в окружении проекта
uv run pytest # то же для любой команды
uv sync # привести .venv в точное соответствие с uv.lock
uv lock --upgrade # обновить версии в файле блокировки
Зависимости описываются в стандартном pyproject.toml, а точные версии всего дерева — в uv.lock, который коммитят в репозиторий. Окружение .venv создаётся и синхронизируется автоматически при uv run, поэтому активировать его вручную не нужно.
Другие режимы
| Команда | Что заменяет |
|---|---|
uv pip install, uv pip compile |
pip и pip-tools, тот же формат requirements.txt |
uv venv |
python -m venv, virtualenv |
uv python install 3.13 |
pyenv: скачивает готовые сборки Python |
uvx ruff check . / uv tool install |
pipx: запуск и установка утилит в изолированных окружениях |
uv run script.py с метаданными в начале файла |
запуск одиночных скриптов с зависимостями (PEP 723)[4] |
Пример одиночного скрипта с зависимостями прямо в файле:
# /// script
# requires-python = ">=3.12"
# dependencies = ["httpx"]
# ///
import httpx
print(httpx.get("https://pypi.org/simple/").status_code)
Команда uv run script.py сама создаст временное окружение, установит httpx и выполнит скрипт.
Сравнение
| pip + venv | Poetry | uv | |
|---|---|---|---|
| Скорость установки | базовая | сопоставима с pip | в разы выше |
| Файл блокировки | нет (нужен pip-tools) | poetry.lock |
uv.lock |
| Управление версиями Python | нет | нет | есть |
Стандартный pyproject.toml |
да | да (с 2.0) | да |
| Зависимость от установленного Python | нужен | нужен | не нужен, один бинарный файл |
Ограничения и критика
uv развивает коммерческая компания, что вызывает у части сообщества вопросы о долгосрочной независимости инструмента; код при этом открыт под лицензиями MIT и Apache 2.0.[5] Поскольку uv заменяет сразу много инструментов, в старых проектах переход может потребовать переписать скрипты сборки и CI. Некоторые возможности pip поддерживаются не полностью, а поведение по умолчанию местами отличается — например, uv pip install по умолчанию требует виртуальное окружение.