Программирование

Почему uv add -r req.txt выдает ошибку зависимостей UV?

Разбираем, почему uv add -r req.txt завершается ошибкой разрешения зависимостей (конфликт numpy и onnx), а uv pip install -r req.txt работает. Объяснение environment markers, requires-python и как правильно добавлять зависимости из requirements.txt в UV.

Почему команда uv add -r req.txt завершается ошибкой разрешения зависимостей в UV, в то время как uv pip install -r req.txt работает успешно?

Описание проблемы:

  • Создан новый проект: uv init myproject
  • Файл req.txt взят из репозитория Whisper-Live на GitHub.
  • Команда uv add -r req.txt выдаёт ошибку:

No solution found when resolving dependencies for split (markers: python_full_version >= '3.13'): ...

Конфликт версий: numpy==1.26.4 в проекте конфликтует с onnx==1.20.0, требующим numpy>=2.1.0 для Python 3.13 (активная версия Python — 3.12).

Предложения из ошибки: ограничить версии Python с помощью requires-python или использовать --frozen.

Вопрос: Почему возникает эта разница в поведении команд? Как правильно добавлять зависимости из requirements.txt в проект UV для оптимальной работы?

Команда uv add -r req.txt запускает строгий резолвер UV и учитывает environment markers и диапазоны Python, указанные в проекте, поэтому может обнаружить конфликт (например, onnx требует numpy>=2.1.0 для python_full_version >= '3.13'), даже если вы сейчас в Python 3.12. uv pip install -r req.txt просто устанавливает пакеты в локальное виртуальное окружение для текущего интерпретатора и не изменяет pyproject.toml, поэтому маркер для 3.13 в этом случае не влияет и установка проходит. Чтобы корректно перенести зависимости из requirements.txt в проект UV, ограничьте requires-python или явно укажите маркеры/пины для спорных пакетов, либо используйте флаги (например --frozen) / временно применяйте uv pip install для локальной проверки.


Содержание


Почему uv add и uv pip install ведут себя по-разному

Коротко: поведение отличается из‑за уровня проверки и области действия.
uv add -r req.txt читает requirements.txt, добавляет строки в проект (в pyproject.toml) и сразу запускает универсальный резолвер UV, который пытается найти совместимые версии с учётом requires-python и environment markers для всех поддерживаемых версий Python в рамках проекта; об этом прямо написано в документации UV по управлению зависимостями (см. раздел про Managing dependencies).

В отличие от этого uv pip install -r req.txt просто устанавливает пакеты в текущее виртуальное окружение, ориентируясь на текущий интерпретатор (ваш Python 3.12) и не меняет pyproject.toml. Поэтому условные требования, действующие только для Python 3.13+, в окружении 3.12 выполняться не будут и конфликт не проявится — именно это и объясняет, почему uv pip install проходит успешно (подробно — в разделе про compatibility с pip).


Разбор конфликта onnx + numpy и роль markers

Что у вас произошло по шагам:

  • В req.txt есть onnx==1.20.0. В метаданных onnx указано условие вроде python_full_version >= '3.13', при котором библиотека требует numpy>=2.1.0.
  • В проекте уже зафиксирован numpy==1.26.4. На Python 3.12 выражение python_full_version >= '3.13' ложно, и обычный pip (или uv pip install) не потребует numpy>=2.1.0.
  • Но UV‑резолвер рассматривает диапазон версий, указанный в pyproject.toml (по умолчанию — поддержка нескольких версий Python) и пытается найти единую комбинацию версий, совместимую с условием для 3.13. Резолвер не находит решения, потому что одновременно удовлетворить numpy==1.26.4 и требование numpy>=2.1.0 (для 3.13) нельзя — и он сообщает ошибку: “No solution found when resolving dependencies for split (markers: python_full_version >= ‘3.13’)”. Подробнее о поведении резолвера смотрите в разделе Resolution | uv.

Иными словами: ошибка — не баг в pip, а логический конфликт между тем, что проект заявляет поддерживать (диапазон Python) и тем, что требуют пакеты при некоторых версиях интерпретатора.


Как правильно добавлять зависимости из requirements.txt в UV

Есть три практичных подхода — в зависимости от цели (быстрая локальная установка vs корректная регистрация в проекте):

  1. «Правильно» для проекта (рекомендуется)
  • Сначала уточните, какие версии Python вы хотите поддерживать, и явно укажите это в pyproject.toml через requires-python. Это предотвратит попытки резолвера подбирать зависимости для неподдерживаемых версий.
  • Потом выполните uv add -r req.txt — резолвер попытается корректно добавить зависимости в pyproject.toml и создать/обновить lockfile.

Пример фрагмента pyproject.toml:

toml
[project]
name = "myproject"
requires-python = ">=3.12,<3.13"

dependencies = [
"numpy==1.26.4",
"onnx==1.20.0; python_full_version >= '3.13'",
]

Такой маркер на onnx подскажет резолверу: для 3.12 onnx не обязателен/не требует numpy>=2.1.0, и конфликт исчезнет.

  1. Быстрая локальная проверка (краткосрочно)
  • Если вам надо просто запустить проект в текущем окружении и проверить работоспособность, используйте uv pip install -r req.txt. Это установит пакеты для текущего интерпретатора, но не зафиксирует их в pyproject.toml.
  • После проверки лучше всё же привести pyproject.toml в порядок (см. пункт 1), иначе повторные воспроизведения окружения будут ненадёжны.
  1. Когда хочется принять «то, что уже установлено»
  • В подсказке ошибки UV предложил либо ограничить requires-python, либо использовать --frozen. Флаг --frozen по смыслу инструмента позволяет принять текущие/существующие версии без выполнения полного поиска вариантов резолвера; это полезно, если вы уверены в текущем окружении и не хотите, чтобы UV менял комбинацию версий. (См. подсказку в документации и вывод ошибки — там прямо предлагаются эти варианты.)

Практические шаги и примеры команд

Шаги, которые можно выполнить прямо сейчас:

  1. Инициализация проекта и быстрый тест (локально):
bash
uv init myproject
uv pip install -r req.txt # быстро поставить и проверить
  1. Если вы хотите корректно перенести зависимости в проект (лучше):
  • Откройте pyproject.toml и задайте целевой диапазон Python, например:
toml
[project]
requires-python = ">=3.12,<3.13"
  • Попробуйте снова:
bash
uv add -r req.txt

Если UV по‑прежнему жалуется на конфликт — отредактируйте/маркируйте проблемную строку в pyproject.toml (пример выше) или вручную уточните версии (pin/relax), пока резолвер не найдёт решение.

  1. Альтернативы при сложных конфликтах:
  • Временно использовать uv pip install -r req.txt для локального запуска и затем привести pyproject.toml в порядок.
  • Принять текущие установленные версии с помощью флага --frozen, если вы доверяете локальному окружению:
bash
uv add -r req.txt --frozen

(Флаг делает так, чтобы UV не пытался перестроить все версии под другие Python‑варианты — его смысл указан в подсказке ошибки.)

  1. После исправления/добавления зависимостей синхронизируйте окружение:
bash
uv sync

Эта команда помогает привести локальное окружение в соответствие с pyproject.toml/lockfile.


Отладка и рекомендации при переносе зависимостей

  • Читайте текст ошибки внимательно: UV указывает, для какого маркера или «split» не найдено решение; это обычно сразу показывает пакет и условие (например, python_full_version >= '3.13').
  • Решите заранее: какие версии Python вы действительно поддерживаете? Если только 3.12 — явно ограничьте requires-python. Это проще и безопаснее, чем пытаться угадать резолверу нужны ли ему 3.13.
  • Если пакет действительно нужен только на новых Python — добавьте маркер в pyproject.toml, как в примере выше.
  • Если вы управляете несколькими целевыми версиями Python (напр., 3.12–3.14) — учтите, что UV попытается найти единую пригодную комбинацию для всего диапазона; иногда придётся подобрать версии пакетов иначе или иметь условные зависимости.
  • Используйте uv pip install для локальной проверки, но не забывайте затем зафиксировать рабочие версии в pyproject.toml. Иначе воспроизвести окружение будет сложно.

Источники


Заключение

Разница в поведении вызвана тем, что uv add -r req.txt запускает строгий резолвер UV и учитывает environment markers и requires-python для всего диапазона версий проекта, а uv pip install -r req.txt просто ставит пакеты в текущее окружение (Python 3.12) и потому «не видит» условие для 3.13. Лучший практический путь — явно задать requires-python в pyproject.toml или добавить PEP‑508‑маркер для проблемных пакетов (например, onnx==1.20.0; python_full_version >= '3.13') и затем применять uv add -r req.txt — либо временно использовать uv pip install/--frozen для локальной проверки, но не забывать затем привести pyproject.toml в порядок.

Авторы
Проверено модерацией
Модерация
Почему uv add -r req.txt выдает ошибку зависимостей UV?