pip 没有正确解析 child/grandchild 依赖项

pip not properly resolving child/grandchild dependencies

我有一个像这样工作的模块依赖树(→ 表示依赖):

a → b, c
b → ruamel.yaml >= 0.16.5
c → ruamel.yaml < 0.16.6, >=0.12.4

我很清楚 ruamel.yaml 0.16.5 将正确解决这两个依赖关系。但是,当我 pip install a 时,我得到以下日志:

Collecting ruamel.yaml>=0.16.5
  Downloading ruamel.yaml-0.16.10-py2.py3-none-any.whl (111 kB)

然后:

ERROR: <package c> 0.4.0 has requirement ruamel.yaml<0.16.6,>=0.12.4, but you'll have ruamel-yaml 0.16.10 which is incompatible.

所以 pip 在选择要安装的包时完全忽略了孙子依赖项。但它意识到它最终搞砸了。为什么 pip 没有在这里选择正确的包。有没有办法让它更好地工作?

我相信这是一个众所周知的问题,目前正在处理中。一周前的留言:http://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html

同时,可以采取一些措施来尝试缓解此类问题:

  • 还原依赖项的顺序(在您的示例中 a 可以在 b 之前列出 c
  • 使用额外的 requirements.txt or constraints.txt 文件
  • 根据实际需要,替代工具可能会有所帮助(我相信 poetry, pipenv,而且很可能其他人也可能有更好的 依赖解析器 ,但它们是不是 pip)
  • 的一对一替代品

今天似乎已经可以测试 pip 的未来依赖解析器:

在某种程度上,似乎也可以通过 pip check 命令在当前版本或 pip 中测试此依赖项解析器。

关于该主题的更多参考资料: