UV — шаг вперёд в управлении зависимостями Python

В мире Python экосистема инструментов для управления зависимостями и виртуальными окружениями всегда была областью живых дискуссий. Долгое время царствовала связка pip и venv, затем появились более сложные и функциональные инструменты, например Poetry, которые упростили управление зависимости в проектах. Однако все они, так или иначе, сталкивались с общей проблемой — скоростью.

В 2024 году на сцене появился новый игрок — uv. Разработанный компанией Astral (создателями известного форматтера Black и линтера Ruff), uv позиционируется как молниеносный менеджер пакетов и виртуальных окружений, написанный на Rust.

Он очень быстрый, с помощью него можно управлять зависимостями, создавать виртуальные окружения, устанавливать версии Python и даже публиковать пакеты — всё это в рамках одного CLI-интерфейса.

В этой статье мы подробно разберем, что такое uv, как его установить на все популярные операционные системы, и рассмотрим несколько примеров его использования.

Что такое uv?

uv — это универсальный инструмент командной строки, который объединяет в себе функции нескольких утилит: Менеджер пакетов, Менеджер виртуальных окружений, Менеджер зависимостей.

Его главная «суперсила» — невероятная скорость. Благодаря тому, что uv написан на Rust, использует оптимизированные алгоритмы разрешения зависимостей и кеширование, он может устанавливать пакеты в десятки раз быстрее, чем pip. Например, установка такого тяжелого пакета, как numpy, или создание виртуального окружения с большим количеством зависимостей (как в проектах с Data Science) занимает считанные секунды.

Это стало возможным благодаря сочетанию четырёх ключевых факторов:

1. Rust под капотом
В отличие от pip и других инструментов, написанных на Python, uv реализован на Rust — компилируемом системном языке, известном своей безопасностью и производительностью. Rust позволяет работать ближе к «железу», минимизируя накладные расходы и обеспечивая мгновенный отклик даже при работе с крупными проектами.

2. Параллельная обработка
uv активно использует многопоточность при загрузке и установке пакетов. Это значит, что десятки зависимостей могут быть установлены одновременно, в то время как pip выполняет эти операции последовательно. Такой подход обеспечивает линейный прирост скорости на многоядерных системах.

3. Оптимизированное разрешение зависимостей
Разрешение зависимостей — одна из самых сложных и медленных операций в мире пакетных менеджеров. uv реализует собственный, высокоэффективный алгоритм, способный быстро находить совместимые версии пакетов даже при сложных зависимостях, не жертвуя точностью.

4. Эффективное кэширование
Каждый пакет, установленный через uv, кэшируется глобально. Это означает что, если один проект уже использует библиотеку, другой сможет взять её из кэша без повторной загрузки. В реальных сценариях это сокращает время установки пакетов во много раз.

Установка uv

Установка проста и сводится к выполнению одной команды в терминале.

На Linux и macOS:
curl -LsSf https://astral.sh/uv/install.sh | sh

На Windows  откройте PowerShell от имени администратора и выполните одну команду:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Кроме того, uv можно установить с использованием популярных пакетных менеджеров или запустить в контейнере Docker. Подробная инструкция приведена в официальной документации проекта.

Проверка установки
После установки на любой системе перезагрузите терминал и проверьте, что uv доступен, выполнив:
uv --version

Команда должна вывести номер установленной версии:

Проверка установки uv puthon

Практические примеры работы с uv

Теперь, когда uv установлен, давайте посмотрим на него в действии.

Управление версиями Python

uv может скачивать и устанавливать различные версии Python.

Командой uv python list можно посмотреть список установленных версий Python.

Если вы ходите увидеть только установленные версии, то добавьте флаг --only-installed

Для установки нужной версии python выполните команду:
uv python install 3.13

Если вы хотите установить самую последнюю версию Питона, до нужна команда:
uv python install

Управление проектом и зависимостями

Давайте создадим новый проект с нуля и настроим его зависимости с помощью uv. Для этого создадим папку uv-test и перейдем в нее.

mkdir uv-test
cd uv-test

Чтобы инициализировать проект в этой директории выполним команду:
uv init

Это создаст следующие файлы в нашей папке:
.gitignore
.python-version — содержит информацию о версии Python, используемой в проекте по умолчанию.
main.py — автосгенерированный python файл с некоторым кодом по умолчанию
pyproject.toml — конфигурационный файл проекта
README.md

Вот содержимое конфигурационного файла:

[project]
name = "uv-test"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []

Создание и активация виртуального окружения

uv автоматически инициализирует виртуальное окружение в проекте при первом запуске скриптов или при установке пакетов. Но если мы хотим вручную создать виртуальное окружение с uv, то необходимо выполнить команду в папке проекта:

uv venv

Эта команда создаст виртуальное окружения в папке .venv с изолированным интерпретатором Python.

Активируется виртуальное окружение как обычно:

На Linux/macOS
source .venv/bin/activate

На Windows (PowerShell)
.venv\Scripts\activate

uv также умеет создавать окружения с определенной версией Python, даже если она не установлена в системе, используя флаг --python:
uv venv --python 3.13

После этого создастся виртуальное окружение с указанной версией Python, а так же версия Python установится в систему и ее можно будет увидеть в списке по команде uv python list --only-installed

Установка пакетов

Допустим, мы хотим добавить библиотеку requests в наш проект, для этого необходимо выполнить команду:
uv add requests

Эта команда делает сразу две вещи:

  1. Добавляет зависимость requests в файл pyproject.toml.
  2. Немедленно устанавливает пакет и все его зависимости.

Скорость будет заметно выше чем установка пакетов с использованием pip install. Откройте файл pyproject.toml и вы увидите изменение в секции dependencies:

dependencies = [
    "requests>=2.32.5",
]

Так же будет создан файл uv.lock, в котором будет полное дерево зависимостей.

Если вам нужно установить сразу несколько пакетов, напишите их названия через пробел:
uv add requests matplotlib

Если вам нужна определенная версия пакета:
uv add requests==2.32.5

Так же можно установить пакеты внеся их в секцию dependencies файла pyproject.toml:

dependencies = [
    "requests>=2.32.5",
    "httpx",
]

После сохранения файла выполните команду:
uv sync

Эта же команда потребуется, чтобы установить все зависимости из pyproject.toml после клонирования репозитория. Она создаст виртуальное окружение и установит в него все зависимости, все это происходит очень быстро. Скорость uv sync — одно из его главных преимуществ.

Установка dev зависимостей

При разработке бывает необходимо установить особые пакеты нужные только для разработки или тестирования, но которые не нужны в production, для этого выполним следующую команду:

uv add --dev pytest

В файле pyproject.toml появится новая секция где будут перечислены все dev зависимости:

[dependency-groups]
dev = [
    "pytest>=8.4.2",
]

Обновление пакетов

Команда uv tree --outdated позволит посмотреть в виде удобного дерева у каких пакетов в вашем виртуальным окружении есть обновления.

Команда uv tree --outdated позволит посмотреть в виде удобного дерева у каких пакетов есть обновления

Для обновления пакета requests необходимо выполнить команду:
uv add requests --upgrade

Обратите внимание, если в вашем pyproject.toml версия requests жестко зафиксирована:

dependencies = [
    "requests==2.31",
]

То команда uv add requests --upgrade не сработает, нужно будет удалить версию requests и добавить заново без указания версии.

uv remove requests
uv add requests

Или же изменить файл pyproject.toml указав необходимую версию в нем:

dependencies = [
    "requests>=2.31",  # или "requests~=2.31" для минорных обновлений
]

А затем выполните команду uv sync --upgrade она обновит все установленные пакеты, для которых доступны новые версии.

Для справки
Операторы версий:
==2.31 — точно версия 2.31
> =2.31 — версия 2.31 или выше
~=2.31 — совместимые версии (2.31.x)
^2.31 — семантическое версионирование (>=2.31.0, \<3.0.0)

Удаление пакетов

Удалять ненужные пакеты в uv можно с помощью простой команды:

uv remove имя_пакета

Эта команда не только удаляет указанный пакет из виртуальной среды, но и автоматически обновляет файл зависимостей (pyproject.toml и uv.lock), поддерживая проект в актуальном и согласованном состоянии. Таким образом, вам не нужно вручную редактировать конфигурационные файлы — uv делает это за вас, что делает управление зависимостями проще и надёжнее.

Запуск Python-скриптов в изоляции

uv позволяет запускать Python-скрипты без необходимости вручную создавать виртуальное окружение. Он сам создаёт временную изолированную среду и устанавливает нужные зависимости прямо перед запуском. Это удобно, если вы хотите быстро протестировать код или запустить одноразовый скрипт, не засоряя систему.

Например:

uv run --with requests script.py

В этом примере uv автоматически создаст изолированную среду, установит пакет requests и запустит файл script.py. После завершения работы все временные файлы можно удалить, а основная система останется чистой.

Работа с requirements.txt

uv полностью совместим с традиционным файлом зависимостей requirements.txt, который используется во множестве Python-проектов. Это значит, что вы можете использовать уже существующий файл без каких-либо изменений.

Установка зависимостей из requirements.txt

Чтобы установить все пакеты, перечисленные в requirements.txt, достаточно выполнить команду:

uv pip install -r requirements.txt

uv автоматически создаст кэш для зависимостей и установит их в несколько раз быстрее, чем стандартный pip.

Обновление зависимостей

Если вы хотите обновить все пакеты до последних версий, можно использовать:

uv pip install --upgrade -r requirements.txt

Эта команда работает аналогично pip install --upgrade, но выполняется гораздо быстрее.

Полезные команды и обслуживание

Чтобы uv всегда работал быстро и без сбоев, полезно периодически выполнять несколько обслуживающих команд.

*Обновление uv
Проект активно развивается, поэтому рекомендуется время от времени обновлять инструмент до последней версии:

uv self update

Эта команда скачает и установит актуальную версию uv, сохранив все ваши настройки.

Очистка кэша
При частом использовании uv может накапливаться кэш пакетов и временные данные. Обычно это ускоряет работу, но если вы замечаете проблемы с зависимостями или нехватку места на диске, можно очистить кэш:

uv cache clean

После этого uv заново создаст кэш при следующей установке пакетов. Это помогает поддерживать систему в чистоте и избавляться от возможных конфликтов старых зависимостей.

Заключение

uv — это не просто «еще один менеджер пакетов». Это качественный скачок в производительности и удобстве работы с Python-проектами. Он берет проверенные временем практики (работа с pyproject.toml и requirements.txt) и выполняет их с беспрецедентной скоростью.

  • Если вы новичок, uv предлагает простой и логичный путь от установки одного пакета до управления сложным проектом.
  • Если вы опытный разработчик, uv сэкономит вам часы ожидания при установке зависимостей и синхронизации окружений.
  • Для CI/CD uv — это находка, так как он значительно сокращает время сборки. Установите uv и попробуйте использовать его в своем следующем проекте. Велика вероятность, что вы не захотите возвращаться к старым инструментам.

Хостинг для ваших проектов