Pip устанавливает излишне конфликтующие зависимости для библиотеки, созданной с помощью Poetry.

Я указал зависимости библиотеки, используя Poetry и ограничения версии ^. Зависимости конфликтуют, если вы просто устанавливаете последнюю версию зависимостей, но они разрешимы и poetry install правильно их разрешают. Однако pip install из pyproject.toml не разрешает их правильно и создает конфликт.

Минимальный пример

структура каталогов:

poetry_poc/
poetry_poc/__init__.py
pyproject.toml

Файл __init__.py пуст, а содержимое pyproject.toml:

[tool.poetry]
name = "poetry_poc"
version = "0.1.0"
description = "minimal example of issue"
authors = ["Your Name <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.6"
requests = "^2.18.4"
snowflake-connector-python = "^2.2.9"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Ограничение snowflake-connector-python = "^2.2.9" разрешается только в версии 2.2.9, поэтому она устанавливается. Эта библиотека затем требует requests<2.24.0, и мой проект указывает requests^2.18.4, поэтому любая версия между 2.18.4 и 2.23.x будет работать нормально, но вместо этого pip устанавливает запросы 2.24.0 и сообщает:

ERROR: snowflake-connector-python 2.2.9 has requirement requests<2.24.0, but you'll have requests 2.24.0 which is incompatible. 

Я пробовал это в совершенно новой виртуальной среде, в которой не было ничего, кроме pip 20.1.1 и setuptools 39.0.1, и я запускаю pip install . --no-cache-dir, поэтому каждая зависимость будет загружена заново. Моя версия поэзии 1.0.10.

Является ли это ожидаемым поведением — этот пункт не разрешает конфликты такого типа — или я делаю что-то не так, или это ошибка?


person daturkel    schedule 24.07.2020    source источник
comment
Попробуйте новое разрешение зависимостей pip: stackoverflow.com/a/62872812/11138259   -  person sinoroc    schedule 24.07.2020
comment
@sinoroc это работает!! хотя мне немного не нравится требовать, чтобы мои конечные пользователи устанавливали предварительную версию pip и использовали флаг нестабильной функции. я ошибался, полагая, что pip решит эту проблему в своей текущей версии?   -  person daturkel    schedule 24.07.2020
comment
Понятно. Есть еще одна вещь, которую следует принять во внимание: насколько я понял, poetry использует нестандартные спецификаторы версии (я не знаю, подходит ли здесь стандартное слово). В этом случае ^ не является частью PEP 440 (что является более или менее стандартной спецификацией). Так что это могло (не уверен, просто предположение) также внести некоторые дополнительные сложности. Может быть, было бы интересно показать, что действительно было написано в метаданных дистрибутива. Может выложите содержимое файла METADATA от тача.   -  person sinoroc    schedule 24.07.2020
comment
Создав колесо с помощью poetry build и проверив его с помощью библиотеки wheel_inspect, я вижу, что она правильно перевела ^ в запросы <3.0.0,>=2.18.4 и снежинку <3.0.0,>=2.2.9, так что, похоже, здесь нет проблем. (Кроме того, переключение на >= в pyproject дает тот же результат, что и в исходном посте.)   -  person daturkel    schedule 24.07.2020
comment
Хороший. Стоило проверить, чтобы исключить спецификатор версии poetry как возможную причину. -- Я бы посоветовал вам зарегистрировать проблему в системе отслеживания ошибок pip, но, поскольку она, кажется, исправлена ​​​​в (скоро будет выпущен?) новый решатель зависимостей, я не уверен, что он получит внимание. Возможно, стоит написать об ошибке в любом случае, может быть, вы получите другое предложение там. -- Тем не менее, я немного удивлен, что текущие версии pip не могут решить эту проблему, так как это не очень сложно. -- Я бы не стал слишком беспокоиться о ваших конечных пользователях, это не в ваших руках, просто добавьте заметное примечание в свою документацию.   -  person sinoroc    schedule 24.07.2020