Почему 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 ведут себя по-разному
- Разбор конфликта onnx + numpy и роль markers
- Как правильно добавлять зависимости из requirements.txt в UV
- Практические шаги и примеры команд
- Отладка и рекомендации при переносе зависимостей
- Источники
- Заключение
Почему 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 корректная регистрация в проекте):
- «Правильно» для проекта (рекомендуется)
- Сначала уточните, какие версии Python вы хотите поддерживать, и явно укажите это в
pyproject.tomlчерезrequires-python. Это предотвратит попытки резолвера подбирать зависимости для неподдерживаемых версий. - Потом выполните
uv add -r req.txt— резолвер попытается корректно добавить зависимости вpyproject.tomlи создать/обновить lockfile.
Пример фрагмента pyproject.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, и конфликт исчезнет.
- Быстрая локальная проверка (краткосрочно)
- Если вам надо просто запустить проект в текущем окружении и проверить работоспособность, используйте
uv pip install -r req.txt. Это установит пакеты для текущего интерпретатора, но не зафиксирует их вpyproject.toml. - После проверки лучше всё же привести
pyproject.tomlв порядок (см. пункт 1), иначе повторные воспроизведения окружения будут ненадёжны.
- Когда хочется принять «то, что уже установлено»
- В подсказке ошибки UV предложил либо ограничить
requires-python, либо использовать--frozen. Флаг--frozenпо смыслу инструмента позволяет принять текущие/существующие версии без выполнения полного поиска вариантов резолвера; это полезно, если вы уверены в текущем окружении и не хотите, чтобы UV менял комбинацию версий. (См. подсказку в документации и вывод ошибки — там прямо предлагаются эти варианты.)
Практические шаги и примеры команд
Шаги, которые можно выполнить прямо сейчас:
- Инициализация проекта и быстрый тест (локально):
uv init myproject
uv pip install -r req.txt # быстро поставить и проверить
- Если вы хотите корректно перенести зависимости в проект (лучше):
- Откройте
pyproject.tomlи задайте целевой диапазон Python, например:
[project]
requires-python = ">=3.12,<3.13"
- Попробуйте снова:
uv add -r req.txt
Если UV по‑прежнему жалуется на конфликт — отредактируйте/маркируйте проблемную строку в pyproject.toml (пример выше) или вручную уточните версии (pin/relax), пока резолвер не найдёт решение.
- Альтернативы при сложных конфликтах:
- Временно использовать
uv pip install -r req.txtдля локального запуска и затем привестиpyproject.tomlв порядок. - Принять текущие установленные версии с помощью флага
--frozen, если вы доверяете локальному окружению:
uv add -r req.txt --frozen
(Флаг делает так, чтобы UV не пытался перестроить все версии под другие Python‑варианты — его смысл указан в подсказке ошибки.)
- После исправления/добавления зависимостей синхронизируйте окружение:
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 — Managing dependencies: https://docs.astral.sh/uv/concepts/projects/dependencies/
- Официальная документация UV — Compatibility with pip: https://docs.astral.sh/uv/pip/compatibility/
- Официальная документация UV — Resolution: https://docs.astral.sh/uv/concepts/resolution/
- GitHub: обсуждение различий команд (пример): https://github.com/astral-sh/uv/issues/9219
- Сравнение uv и pip (обзор): https://realpython.com/uv-vs-pip/
- Официальная страница пакета UV на PyPI (про механизм резолвера): https://pypi.org/project/uv/
Заключение
Разница в поведении вызвана тем, что 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 в порядок.