• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

На проверке UV и Python: альтернатива pip и venv

1751154160109.webp

Друзья, сложно не согласиться, что для маломальски серьёзного проекта возможностей стандартной библиотеки Python рано или поздно становится недостаточно. Вам может потребоваться загрузить и распарсить веб-страницу, использовать расширенные математические вычисления, более сложные нежели предоставляет модуль math, или написать асинхронный код. В таких ситуациях на помощь приходит главный источник сторонних библиотек Python - По состоянию на середину 2025 года там опубликовано более 650К проектов, каждый из которых вы можете подключить в свой код и использовать его возможности.

AD_4nXcO-3UUXNmY6q3BRNYuBokg0WPCcA8XKdqKdEhhJg_EEgf2B8wghiMiwm6n-EHSRfawv94XxN8u8gI6QKUX1wJrpESPRMb0tL6vQmznimW8aMEboV6a_FWx4QnKqlz7Zc1P_tdlbA

Можно с уверенностью сказать: почти любая идея, которая вам, как разработчику, пришла в голову, уже была реализована или находится в процессе написания. Конечно, никто не запретит вам самостоятельно попытаться решить эту же задачу, наступать на те же грабли и тратить часы, а то и дни на то, что уже давно было решено. Но эффективнее использовать уже готовые решения! Когда вам нужен молоток или гаечный ключ - проще зайти в магазин, чем начинать строительство металлургического завода.

1751152932092.webp

Для взаимодействия с - скачивания нужных вам пакетов в Python создали отдельный инструмент, который как несложно догадаться, называется менеджером пакетов - pip. В версиях Python младше 3.4 его требовалось устанавливать отдельно, а вот начиная с версии 3.6 он уже интегрирован в установочный модуль.

Среди возможностей pip, как было сказано выше - получение, обновление и удаление пакетов, поддержка использования файла зависимостей requirements.txt. Но и недостатков у этого инструмента хватает - скорость работы оставляет желать лучшего, нет встроенной поддержки lock-файлов (нужны дополнительные инструменты вроде pip-tools) и, конечно, возникновение разного рода проблем при разрешении конфликтующих зависимостей - нужные версии приходится вручную откатывать или удалять.
AD_4nXdc_lJRJmA7gj3BB6DV8BKWtvss-0Lc01h0YKdTtLQF8lc-Bs2nX1isY8kceIFYQpE1ET7Jnl2Qnr7VfGs6Jaun5i4M_QagVPSLk8lnAJOLaV1GXh-P6n-QI_23fsyZmTCmm8zC9A
Подобные сложности привели к появлению новых инструментов, с более гибким управлением зависимостей - , , . Вот о последнем и хочется рассказать подробнее.

Сравнение скорости​

Главное преимущество uv перед аналогами - его высочайшая скорость работы. Давайте проверим, насколько быстро uv справится с установкой модуля

AD_4nXet6tlebf2561yQhCtrpumJT_tRafnx-NOrO1JXvAIySUlhg8jAwVaNzRUwf6TN7o73Dmo6xa1jG77Zs3BBrhM-k1ttkW3PWI8pG2Uo-Ntki6EJ7d6HeI0VRqZDAOYHWKOjREGaNw
AD_4nXcWfsduaxLUlW8ke23OqPFTRFDhiz7ex-qEP86Iut5kwYkpIX4gMnAPH8YJWQExqn9Lf58TrxOs15eHeIA3KiQnW56xWtmhqeNAcAwwrufegwNG8KFBVw3x2BOmmYtMMPznXU7-ZQ
AD_4nXc_i0L5fCMMCXRm6Xtar72WdQ_rOP65v62JygOWVxNJIXkrNEKKBzGrs-2agz1yMAycOuADzYnf-ufB3nubSFyOZBtGoYKF8nJFF9Jf3GH_ntJrAhssak5jO6T-YJNPdkGkjBJN


Разница колоссальная - uv справился за 1.027 секунды, тот же pip-sync за 4.354 секунды, стандартный pip показал время в 1.5 секунды.
Такую скорость выполнения uv обеспечивает язык, на котором он написан - Rust. Да, вот так сложилось, что менеджер пакетов для языка Python написан на языке Rust. Подобный подход дает значительное преимущество перед Python-реализациями pip и pip-tools: потребляется меньше ресурсов, используется параллельная загрузка и установка, и мы не задействуем интерпретатор Python, то есть снижаем дополнительные накладные расходы. Кроме того, uv распространяется через один бинарный файл, не требующий зависимостей, ему также не нужен pip для установки.
В отличие от pip, в uv встроен собственный dependency resolver “решатель зависимостей”, который позволяет учитывать все версии пакетов одновременно.

Установка uv​

Установка uv незамысловата - в Linux/macOS мы можем использовать утилиту curl для скачивания bash скрипта с нужными командами установки:
curl -LsSf https://astral.sh/uv/install.sh | sh
а в Windows используем powershell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
AD_4nXcMSNQN1ux8S05t3Ufi_8-lhoUEfszMty5gd74yCJWQW9ZV4iAlFfo0bFOoDrVpeSaGsfAJ6qZGNtjEaWhmexMHHnZF4Lrge9vwA1kB2mtiNfsqWP2VkDAFS1BY2U76_Et-YSbgzg

Есть вариант установить uv через pip
AD_4nXcBrqouqSd2bL4_JHCk4S3NLf57ARQu_EB18Xx6HZWTl0l-8HjqjA54f7PLTBHv0RQgDr0ZdNAUVbUKIYVIlka7ku-1VcN0S0rl66p8wcUKwebx9JCY-LANFHUwwvu4km9AlIG3

С процедурой установки на другие системы можно ознакомиться на официальном проекта

Работа с версиями Python​

Установив uv, мы можем сразу узнать, а вообще какие версии Python у нас сейчас установлены в системе.
uv python list
AD_4nXf9qjKS4MYLstG3VJNiBUAfUatHLy5TuVh09b8CviwniD5Hu6x0g2JYbb0rzevggdWCSJE8gqS0cYxTcRwWsW88g-YWwaLLfCZK7WV9G91x7Z4yoFtJSQqkm7zi-4ZD5f6hsL1r

Красным цветом uv выделил установленные версии Python - это 3.13.2, 3.13.0, 3.12.7 и 3.9.2, а серым показал доступные - те, что мы можем прямо из uv установить в систему с использованием конкретной реализации - cpython, pypy или graalpy (высокопроизводительная реализация Python на платформе GraalVM, предназначенная для ускорения Python-кода за счёт JIT-компиляции и интеграции с Java).

Для установки нужной версии используем аргумент install и указываем версию
uv python install 3.13.5
AD_4nXd3k8Wz913fH8v-x1_aNQbf5wTy5xIPyO5iwxQGL3zl4y7xbqxqx4wVqfdvv8duFtnDRzB-ms9yFZ7pawiZ_rDlpXx5ol9kThXZ6KB2A0gF5PLXdf3S9VkDULOdbUnP_8dFHay7xA

Обратите внимание на время скачивания и установки - прошло порядка 10 секунд, а у нас уже есть актуальная версия!

Через модуль platform мы можем вывести на печать версию интерпретатора
uv run python -c "import platform; print(platform.python_version())"
1751156513364.webp

Инициализация проекта​

Имея на руках нужную версию python, мы можем приступать к работе. После создания исходной папки, где будут храниться файлы проекта, мы должны создать базовую, "классическую" структуру Python-проекта, которая будет состоять из следующих папок и файлов:
  • папка .git, содержащей данные для отслеживания версий, коммитов и истории
  • файл .gitignore - который указывает, какие файлы и папки не нужно отслеживать в текущем репозитории.
  • pyproject.toml - конфигурационный файл, который описывает метаданные Python-проекта и задаёт его зависимости.
  • .python-version - файл с указанием версии интерпретатора python, используемой в текущем проекте.
  • main.py - исходный файл программы.
  • README.md - файл с описанием проекта.
Все эти файлы и папки мы можем создать одной командой
uv init

AD_4nXd2I_kbeKut7W8J6tgoGxCdnC92geecC7g0Q2ANjsRt1CCvoS6ef0URptGMDQr2wSkIgAe3eei1ejqmo4xAla3qupV2TsA6iQjpfTNWYY2sZoaIi6VwYedrys0bJ4yirL1rrP2WPA

Вся структура файлов создана, добавлены необходимые заглушки и мы можем тут же начинать писать код. uv даже в main.py добавил функцию main и точку входа! Попробуем запустить:
uv run main
AD_4nXcZbkdPokyYJpCEh3gFg5h3tDx9gCKKT-73d66mBYAtfnuPnaxbmynjfv-YJEJJCx0vSEsSi2PYsSzEtpPWe0eUkaMJn8IyTgPdKgEiBOXE9bQDXDkj3VmSOEBUz8g-PhpMcd3fGg

uv подтянул нужную версию интерпретатора из файла .python-version и выполнил код из файла main.py.

Мы можем указать иную версию Python в .python-version файле и именно она будет использована для запуска нашего кода:
AD_4nXfRItPvCQu349eOXa_Nzv3sRKrp3GTZCIw2NwMAdeI74znpUWLlC__uGICWZRwVQkVcOcswsde7RBYZy9CrjyiY_u6hkn6GVreJoUhxc3XnZhDKM33Tu9Pz-6ShFEokSF2fKTGWtA

Виртуальное окружение​

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

Создать это виртуальное окружение можно самостоятельно командой
uv venv
AD_4nXciOwN6cZMZSk3yye_NDEY-Jj9taqRkBsqY-mxrtlSB6lKZD8HoZt7NsR6spUUnEWkzgyroUEx6wSVA1Uygtke0HF3GswSFkPlS50xlLCgz8f59fw-VE0lkBsY35oNjR-aQNHOV6Q

Это аналог команды
Bash:
python -m venv
, но более компактный и удобный. Мы создаем изолированное окружение, автоматически его активируем и работаем без использования зависимостей системного Python.
Также мы можем указать конкретный путь для хранения файлов
uv venv .my_venv
AD_4nXfrlTLvYJhrL2VHmttPfeh4_l4G-YgVFoBqq5pZZq0Zplopx4j1TyIPCeaIl2A06L33wR16Z4uMWtfSOob0DlJraXqDalp4Qy-wEW2ZsllVE9ZuMONzGLuLSGlAnfWkrJ9PGnHzoQ

Давайте добавим в main.py файл код для получения нашего юзерагента и ip адреса через сервис
Python:
import requests
from fake_useragent import UserAgent


def main():
    ip_url = "https://ifconfig.me/ip"
    ua_url = "https://ifconfig.me/ua"

    answer_ip = requests.get(ip_url).text
    answer_ua = requests.get(ua_url).text
    answer_ua_1 = requests.get(ua_url, headers={"User-Agent": UserAgent().random}).text

    print(f'{answer_ip=}')
    print(f'{answer_ua=}')
    print(f'{answer_ua_1=}')


main()
Импортируем нужные библиотеки, создаём функцию main, где создаём две строки с URL. При переходе на эти ссылки мы получим свой ip адрес и юзер агент. Создаём 3 запроса - в последнем указываем в заголовках словарь с нужным нам ключом и значением.

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

Для выполнения нам нужно установить 2 пакета - и , для этого используем команду
uv add requests fake-useragent
AD_4nXe9yPkKPjx8_4j_05CwB-BJJsX2hs7NwjIudVsMn7tpF_R85GXmh4xsgh9TamyqHTI6LrmGF17oi9OObCJz5C8pSRsdQJxvnUCxZpBmbwFbNXO9AX6S25ZyIeE0uhcXrWc4A1ppMQ
AD_4nXf_pT7HEL9iGKe1EL_SeVP2N5CR9cHwr_nQc-Vh7sddr-bDsY97rchlt4G2vtHjnyS841-ki_BBw7wFeme-ITgryG9KrFNdpecTLJ0S_oGY9Lz_4eRhgDP3wtwKgylwI-bKXoqIKA
эти пакеты устанавливаются в наше виртуальное окружение, а кроме этого еще и добавляются в файл pyproject.toml

Выполнение кода​

Запускаем наш код
uv run main.py
AD_4nXdi75WsZGGCLC33V_RurnCL1--ZnKEFnjkfZ5s3UwtOIEykYmMFFeJjIgx0OFjeSzvrtHWqBzDHMZqezdQgRMMutyinV6clQx5bmS2PffDWYzvU1Xsktl_EPZLGzp_6fKeqCuVn

И видим ожидаемый результат от сервера - наш ip адрес, стандартный юзерагент и юзерагент, сгенерированный случайным образом.
Установить зависимости можно и из файла requirements.txt командой
Bash:
uv pip install -r requirements.txt
таким образом мы, не затрагивая системные версии, добавим необходимые модули в наш проект. Аналогично себя ведут и другие команды pip (uv pip list, uv pip install, uv pip freeze и т.д.)

Какие еще полезные опции есть у параметра run?
Опция
Пример
Назначение
--with <модули>
uv run --with requests –with fake-useragent==1.2.0 main.py
uv запустит файл main.py, с указанными модулями. Для каждого модуля нужен свой аргумент --with. Можно дополнительно указать определенную версию модуля
--with <группы>
uv run --with dev,test main.py
Установить и использовать опциональные зависимости (из pyproject.toml) Необходимо указать группы модулей в toml файле
--env <окружение>
uv run --env .venv pytest
Запустить команду в указанном виртуальном окружении
--python <версия>
uv run --python 3.11 main.py
Указать версию интерпретатора Python явно и вручную
--no-reinstall
uv run --no-reinstall main.py
Не устанавливать зависимости, даже если они не найдены

Что ещё стоит изучить
В статье мы узнали о базовом функционале uv - установке различных версий python, созданием окружения, управлением зависимостями и примерами запуска кода. Но арсенал инструмента гораздо богаче: здесь и возможность установки из локальных директорий, из git или по URL, возможность указания версии python, зависимостей и пакетов прямо в заголовке файла, создание lock-файла через uv pip compile, установка из uv.lock через uv pip sync, интеграция с MAKE и многое другое.

Как видите, uv предоставляет колоссальные возможности для запуска вашего кода разными интерпретаторами, под разными системами и с разными версиями. Он отлично заменяет собой инструменты вроде pip, venv и pip-tools, позволит иметь под рукой нужные версии Python прямо в консоли - не придётся открывать , искать и скачивать конкретную версию - всё доступно прямо через uv, без перехода на внешние сайты. Скорость установки и выполнения опять же на высоте, а благодаря поддержке pyproject.toml uv особенно хорошо подходит для командной разработки. Все эти плюсы делают uv идеальным кандидатом на роль менеджера пакетов по умолчанию!
Попробуйте использовать uv в своём следующем проекте, даже если вы пока работает с pip. Он легко интегрируется и не требует сложной миграции.

А узнать больше о языке программирования Python, научиться с нуля писать прикладной софт и понять, как этот язык программирования используется Пентестерами можно на наших курсах Академии Кодебай: Основы Python и Python для Пентестера.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab