【问题标题】:How does Python / pip handle conflicting transitive dependencies?Python / pip 如何处理冲突的传递依赖?
【发布时间】:2020-02-05 21:33:04
【问题描述】:

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

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

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

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

  1. fork b1(或 b2)和适用于 fork 的 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]

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

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

【问题讨论】:

标签: python pip dependency-management python-poetry


【解决方案1】:

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

这不是解决方案。如果c 管理一个共享资源(例如控制台)迟早b1b2 将通过不同的cs 互相踩踏输入或输出,你最终会得到不正确的输入和垃圾输出。

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

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

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

【讨论】:

  • 好吧,如果c 不会产生副作用(例如纯函数),那么将两个版本的c 放在一起安装是完全可以的。正如您所说,共享资源会导致问题。库开发人员在使用日志记录等方面应该三思而后行的另一个例子......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2020-10-02
  • 2021-09-03
  • 2017-09-10
相关资源
最近更新 更多