DEV Community

dmkjfs
dmkjfs

Posted on • Edited on

1

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

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (0)

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay