Python / pip 如何处理冲突的传递依赖项?

Mar*_*oma 4 python pip dependency-management python-poetry

假设我想安装a需要包b1b2. 反过来,b1需要c > 1.0.0b2需要c < 1.0.0。所以不能用同一个包同时满足b1和的要求b2

原则上/其他编程语言,这不是问题。可以c并排安装两个版本,并确保b1使用的版本不是b2.

但是,我不确定 pip 是否可以安装同一个包的两个版本。我的第一个问题是:pip 可以安装一个包的两个版本吗?

我的主要问题是如何实际处理该问题。我现在能想到的唯一方法就是

  1. b1(或b2)和一个版本c是作品叉,并上传b1_forkedc_for_b1_forked到PyPI中,或
  2. 在我的项目中直接包含b1(或b2)的代码

两者似乎都比必要的问题更多。

我试过的

>>> import natsort; print(natsort.__file___)
'/home/moose/.local/lib/python3.6/site-packages/natsort/__init__.py'

$ cd /home/moose/.local/lib/python3.6/site-packages
$ ls
[... a lot of *.dist-info directories, some .py files, some .so files, ]
[... some directories called like the packages I've installed]
Run Code Online (Sandbox Code Playgroud)

所以我很确定这是 Python 查找已安装包的地方,并且只安装了一个版本(尽管*-dist-info目录让我有点困惑)。

这篇博客文章表明,目前没有好的解决方案可以解决冲突的传递依赖项。其他项目(例如诗歌)对此有帮助吗?

phd*_*phd 5

原则上/其他编程语言,这不是问题。可以c并排安装两个版本,并确保b1使用的版本不是b2.

那不是解决办法。如果c管理共享资源(控制台,如)早晚b1b2会踩对方的输入或输出端通过不同cS和你结束了不正确的输入和输出的垃圾。

你所描述的是一个普遍的问题,不限于 Python 或pip. 唯一的解决方案是更改b1和/或b2同意c. 降级b1以允许c < 1.0或升级b2以允许c > 1.0

pip一个包可以安装两个版本吗?

不,问题不在于pipPython:它的导入系统不允许从同一包的不同版本导入。你可以看看mitsuhiko/multiversion(仅限Python2)。

  • 好吧,如果“c”永远不会引起副作用(例如纯函数),那么将两个版本的“c”放在一起安装是完全可以的。正如您所说,_共享资源_导致了问题。另一个例子为什么库开发人员应该三思而后行使用日志记录等...... (2认同)