DEV Community

dmkjfs
dmkjfs

Posted on

UV как альтернатива Poetry

Пакетных менеджеров для питона как-то слишком много. У этого, конечно, есть очевидная причина - скудность функционала pip, встроенного пакетного менеджера. Но всё равно внутренний перфекционист хочет простое решение из коробки. Установил питон - и сразу получаешь быстрый и удобный пакетный менеджер, и ещё желательно менеджер версий питона. Но вместо этого получаешь pip. Кто-то, конечно, его реально пользует, но всё-таки poetry, pdm, conda, pipenv или хотя бы pip-tools гораздо удобнее.

Ну окей, казалось бы - всем хорош poetry. Я сам использую его в большинстве проектов. Но установка зависимостей начинает казаться медленной - особенно при пересборке docker-контейнера. Плюс гемор с установкой самого poetry или со сменой версий питона - меняешь версию через, например, pyenv, а poetry при попытке пересоздания окружения выдает ошибку. Хотя предполагается что умеет работать с разными версиями питона. Решается, конечно, легко - через указание полного пути к интерпретатору, но всё равно костыли. Как и установка того же pyenv, и вообще работа с ним. А больше контролировать версии питона, вроде как, нечем.

И вот, в феврале появилось интересное решение от создателей Ruff. Пакетный менеджер UV, написанный на расте. Чисто консольный, конечно, причём синтаксис очень напоминает poetry. По функционалу это почти одно и то же, но с кучей плюшек и в несколько раз быстрее. В доке приведена вот такая диаграмма времени установки одинакового набора зависимостей:

сравнительная диаграмма времени установки зависимостей

Синтаксис действительно похож на poetry. Вот так, например, создаетс проект(сразу переходим в каталог):

uv init project
cd project
Enter fullscreen mode Exit fullscreen mode

Там у нас вот такая вот структура:

project
├── .python-version
├── hello.py
├── pyproject.toml
└── README.md
Enter fullscreen mode Exit fullscreen mode

Зависимости, как и у poetry, сохраняются в конфиге pyproject.toml, версия питона - в .python-version.

Создадим виртуальное окружение:

uv venv
Enter fullscreen mode Exit fullscreen mode

Добавим SQLAlchemy в зависимости:

uv add sqlalchemy
Enter fullscreen mode Exit fullscreen mode

Или можем добавить конкретную версию:

uv add sqlalchemy@2.0.32
Enter fullscreen mode Exit fullscreen mode

Теперь удалим:

uv remove sqlalchemy
Enter fullscreen mode Exit fullscreen mode

Теперь сахар - менеджмент версий питона. Поставим 3.11.9 и создадим окружение с таким интерпретатором.

uv python install 3.11.9
uv venv --python 3.11.9
Enter fullscreen mode Exit fullscreen mode

Версия питона сохранится в .python-version, и не надо при смене интерпретатора каждый раз указывать на это пакетному менеджеру, ведь UV и есть пакетный менеджер. Причём можно даже не устанавливать версию руками, а сразу создать окружение с нужной версией: если она не установлена, то UV сам её спуллит, то есть можно вообще об этом не думать - ну кайф же.

Как и в poetry, есть функционал по сборке и публикации пакетов на PyPI. Собрать контейнер и опубликовать пакет можно в две команды:

uv build
uv publish
Enter fullscreen mode Exit fullscreen mode

Ещё можно использовать UV как супервизор, и запускать скрипты и приложения при помощи uv run

И вишенка на торте - docker образ.

FROM ghcr.io/astral-sh/uv:python3.12

WORKDIR /app

RUN uv venv

CMD ["run", "app"]
Enter fullscreen mode Exit fullscreen mode

Не надо пуллить образ питона и там устанавливать UV через pip, можно сразу спуллить образ UV и кайфовать. Плюс там ещё много всяких фишек, но об этом в доке (которая, кстати, очень понятная) - те, кому эти фишки нужны в доку полезть не побоятся.

В целом, реально удобный тул и хорошая альтернатива poetry. Ни в одной IDE пока нет поддержки UV, но это вопрос времени. Круто, что столько фишек, хочется, чтобы проект развивался. Делитесь этим постом и пишите, чем пользуетесь вы.

P.S. И надо сабаться на тгк: https://t.me/dmkjfss

Top comments (0)