uv — относительно новый и динамично развивающийся инструмент, упрощающий создание и управление Python окружениями. Быстро, без лишних настроек и с простым интерфейсом
uv — довольно быстрый пакетный менеджер и менеджер виртуальных окружений для Python, написанный на Rust. По заявлению разработчиков, uv способен заменить такие Python инструменты, как pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv и другие.
Установка uv
Рекомендуемый способ установки uv с помощью автономного установщика
Для Windows:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Для macOS и Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Установка uv с помощью pip
Если вы предпочитаете классический способ установки uv через pip из PYPI:
pip install uv
Иные способы установки uv
Cargo:
cargo install --git https://github.com/astral-sh/uv uv
Homebrew:
brew install uv
Winget:
winget install --id=astral-sh.uv -e
Scoop:
scoop install main/uv
Более детально про установку можно ознакомиться тут: Installing uv
Проверка установленной версии uv
uv --version
Обновление uv
Если uv был установлен через автономный установщик, обновить его можно следующим образом:
uv self update
Если uv был установлен через pip:
pip install --upgrade uv
Создание нового проекта
Создаём новый проект и переходим в директорию:
uv init venv
cd venv
uv init
создаёт директорию venv и размещает в ней файлы проекта. cd venv
перемещаемся в новосозданную директорию.
Альтернативно, можно создать директорию и внутри неё запустить uv init
:
mkdir venv
cd venv
uv init
Содержимое директории после создания проекта:
.gitignore
.python-version
hello.py
pyproject.toml
README.md
Файл .python-version
содержит информацию о версии Python, используемой в проекте по умолчанию. Эта версия аналогична той, которая была установлена в системе на момент создания окружения. Файл pyproject.toml
содержит информацию об установленных зависимостях:
[project]
name = "venv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
dependencies
пока пуст. Он будет наполняться по ходу установки пакетов. Посмотрим на него ещё раз, но попозже.
Запуск Python-скриптов
Внутри директории venv
лежит файл hello.py
, который при запуске выведет Hello from venv!
. Используем его для запуска изнутри нашего окружения:
uv run hello.py
uv run
— это команда для инлайн-запуска Python-скрпитов без необходимости вручную активировать и деактивировать виртуальное окружение. При выполнении uv run
команды, uv автоматически активирует виртуальное окружение, а после завершения работы скрипта деактивирует его.
При первом запуске команды uv run
, внутри venv
будет создана директория .venv
, содержащая устанавливаемые зависимости, используемые в окружении. Помимо этого, будет создан кроссплатформенный uv.lock
файл.
.venv
.gitignore
.python-version
hello.py
pyproject.toml
README.md
uv.lock
Установка пакетов
Установка пакетов производится через команду add:
uv add requests
Если нужно установить более одного пакета:
uv add requests yt-dlp
Или если нужна специфичная версия:
uv add requests==2.31.0
Взглянем ещё раз на значение dependences в файле pyproject.toml
после установки requests:
[project]
name = "venv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"requests>=2.32.3",
]
Если нужно установить список пакетов с версиями, заносите его в dependencies
и затем выполняете:
uv sync
Отображение дерева зависимостей:
uv tree
Если нужна установка dev
зависимостей:
uv add --dev mypy black
Обновление пакетов
Чтобы узнать для каких пакетов доступны обновления, для tree доступен флаг outdated:
uv tree --outdated
Обновить пакет можно так:
uv add yt-dlp --upgrade
Если нужно обновить все пакеты, для которых доступны новые версии, то можно так:
uv sync --upgrade
Если нужна определённая версия:
uv add requests==2.31.0 --upgrade
Если вы установили определённую версию пакета, и в последствии решили обновить её до последней актуальной, то в pyproject.toml
, на примере requests, нужно изменить requests==2.31.0
на requests>=2.31.0
и затем уже запустить uv add requests --upgrade
.
Удаление пакетов
Удалять пакеты можно по одному или сразу несколько:
uv remove requests yt-dlp
Как работать с разными версиями Python в одном проекте
Устанавливаем python 3.10 в дополнение к используемому 3.13, и проверяем количество установленных версий:
uv python install 3.10
uv python list --only-installed
Чтобы у нас появилась возможность использовать 3.10 в окружении, меняем в pyproject.toml
requires-python
с 3.13
на 3.9
:
[project]
name = "venv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
"requests>=2.32.3",
]
Если нужно, чтобы версия 3.10 была в окружении по умолчанию:
uv python pin 3.10
Инлайн-запуск нужной версии python, без изменения версии по умолчанию:
uv run --python 3.10 main.py
Если необходимо установить сразу несколько версий python:
uv python install 3.10 3.11 3.12
Можно установить версию python в заданных границах:
uv python install '>=3.8,<3.10'
One more thing
Помимо удобного интерфейса, быстрой скорости работы, инлайн-запуска и возможности работы с несколькими версиями Python в одном окружении, в uv есть мощный инструмент — tool.
Как это работает:
uvx black main.py
Команда uvx black main.py
выполняет следующие действия:
uvx
создает временное изолированное виртуальное окружениеЗагружает и устанавливает пакет
black
(форматтер кода для Python) в это временное окружениеЗапускает инструмент
black
из установленного пакетаЗапущенный
black
анализирует и форматирует код в файлеmain.py
Если кратко, то uvx
загружает и устанавливает в изолированное окружение пакет, и затем запускает его. Временное изолированное виртуальное окружение находится за пределами нашего окружения venv
, в директории cache. Для того, чтобы очистить место временного пребывания пакетов, загружаемых через uvx
, достаточно одной команды:
uv cache clean
Кстати, uvx
это алиас для uv tool run
, призванный упростить ввод, чтобы каждый раз не писать uv tool run
.
Рассмотрим наглядный пример:
uvx cowsay -t "Hello Habr"
uvx
загрузил и установил пакет cowsay во временное окружение, а затем запустил его. Пакет cowsay генерирует ASCII-арт изображение говорящей или думающей зверушки с текстом, который вы задаете.
Дополнительно, uvx
позволяет устанавливать пакеты обычным способом. В отличие от временных установок, пакеты, установленные обычным способом, сохраняются после очистки кэша. Подробнее — тут: Tools uv
В завершение, стоит отметить, что в uv
существует более одного способа взаимодействия с инструментом, и это может сбивать с толку, особенно если вы уже встречали другие описания интерфейса. Здесь uv add requests
и uv tree
, а где то в другой статье uv pip install requests
и uv pip list
. Вот, что об этом написано в документации(ниже вольная интерпретация):
Интерфейс pip
в uv
— это скорее эмуляция или низкоуровневая имитация поведения pip
, созданная для того, чтобы обеспечить плавный переход для разработчиков, переходящих с pip
. Однако, это не тот же pip
, который используется в стандартной экосистеме Python. Команды, использующие этот интерфейс, скорее всего, могут отличаться от стандартного поведения pip
, и если вы используете эти команды, будьте готовы к возможным отличиям, особенно в нестандартных сценариях. Основная цель этого интерфейса — облегчить переход на uv
для тех, кто уже знаком с pip
, но для более гибких и сложных операций лучше использовать стандартные команды uv
.
Комментарии (15)
akgen
23.01.2025 03:30А может ли
uv
создать виртуальное окружение, которое ранее было настроено с помощьюpoetry
?Ведь у `poetr`y` зависимости описываются в отдельных блоках pyproject.toml:
[tool.poetry.dependencies]
python = “^3.11”
scipy = “^1.15.1”
mst_72
23.01.2025 03:30Люди, а в чём фишка вместо python hello.py постоянно использовать poetry|uv|... run hello.py. Python внезапно стал новым N-word?
akgen
23.01.2025 03:30Внутри hello.py может быть зависимость какой-то версии, которую не хочется ставить в системный питон. Поэтому можно установить её внутри виртуального окружения и запускать скрипт оттуда же
rSedoy
23.01.2025 03:30чтобы использовать конкретное виртуальное окружение, если напрягает, то можно активировать через source или другими способами, тогда будет работать python hello.py
molnij
23.01.2025 03:30А кроме скорости, зачем нам нужен 15 стандарт?
rSedoy
23.01.2025 03:30скорость очень значимый параметр, еще удобная установка версий python, uv по нормальному агрегировал кучу фич разбросанных по разным инструментам, плюс свои фишки
mst_72
23.01.2025 03:30Он точно устанавливает версию python (как conda) или всё-таки создаёт окружение из присутствующих в системе версий питона (как poetry)?
rSedoy
23.01.2025 03:30именно устанавливает, правда не знаю как именно устанавливает conda, но будет именно версия которой нет в системе, а, ну и установка конечно же будет не системная, что правильно, системный python лучше ставить только пакетными менеджерами системы
empenoso
Заставка красивая. А как сделали?
axelthepop Автор
Adobe After Effects
empenoso
я думал каким-нибудь хитрым скриптом