5

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

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

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

我的主要问题是如何实际处理这个问题。我现在能想象的唯一方法是

  1. fork b1(or b2) 和一个c适用于 fork 的版本,然后上传b1_forkedc_for_b1_forkedPyPI,或者
  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]

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

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

4

1 回答 1

7

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

那不是解决方案。如果c迟早管理一个共享资源(例如控制台),b1并且b2会通过不同的 s 相互踩踏输入或输出c,那么您最终会得到不正确的输入和垃圾输出。

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

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

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

于 2020-02-05T22:44:45.043 回答