fix: pip is looking at multiple versions of ctcli to determine which version is compatible with other requirements.
本文最后更新于 2025年7月27日 下午
pip install依赖冲突: pip is looking at multiple versions of ctcli to determine which version is compatible with other requirements.
背景描述
遇到一个超级离谱的pip安装包问题,源于pip安装包时的依赖冲突,但是报错信息最终与解决方案却毫无关系,浪费了好几小时才解决这个问题。借此文章复盘下问题并梳理循环安装依赖的原因及解决方案。遇到的具体问题是:使用pip install xxx安装包时,pip循环下载解析安装包的历史版本,无法正常退出。错误信息如下所示:
1 | |
解决方案
先说解决方案:需要指定包含所有安装依赖的镜像源。(注意:这里的解决方案不是这个报错的唯一解决方案,仅供参考)
出现问题时我的安装指令是,这里-i指定的是公司内部镜像源,xxx也是内部包:
1 | |
安装报错:
1 | |
出现报错的原因是内部镜像源没有xxx安装包所需要的依赖库argcomplete,因此出现循环下载历史包的现象。解决方案为:加上extra-index-url参数,指定外部镜像源,因为外部镜像源中包含argcomplete库:
1 | |
这也就是这个问题巨坑的地方,安装依赖包没有在源中,但是pip却不提示未找到安装包,而是会循环下载旧版本,直至找到一个满足所有依赖库的历史版本,
原因分析
借鉴官方文档,在使用pip install安装包时,会首先解析安装包的依赖文件,如果依赖文件不满足或有冲突,则会回退历史版本持续下载,直到找到一个不冲突的版本。
例如,使用pip install tea安装tea库,包含三个依赖文件:hot-water,spoon,cup。
- pip首先会获取
tea库的最新版本,并解析tea库的依赖文件,得到hot-water,spoon,cup。 - 依次对
hot-water,spoon,cup三个库重复第一步骤,得到它们的最新版本及依赖库版本。 - pip注意到
spoon和cup的版本不兼容,则会会退cup版本,找到一个和spoon兼容的版本。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36pip install tea
Collecting tea
Downloading tea-1.9.8-py2.py3-none-any.whl (346 kB)
|████████████████████████████████| 346 kB 10.4 MB/s
Collecting spoon==2.27.0
Downloading spoon-2.27.0-py2.py3-none-any.whl (312 kB)
|████████████████████████████████| 312 kB 19.2 MB/s
Collecting cup>=1.6.0
Downloading cup-3.22.0-py2.py3-none-any.whl (397 kB)
|████████████████████████████████| 397 kB 28.2 MB/s
INFO: pip is looking at multiple versions of this package to determine
which version is compatible with other requirements.
This could take a while.
Downloading cup-3.21.0-py2.py3-none-any.whl (395 kB)
|████████████████████████████████| 395 kB 27.0 MB/s
Downloading cup-3.20.0-py2.py3-none-any.whl (394 kB)
|████████████████████████████████| 394 kB 24.4 MB/s
Downloading cup-3.19.1-py2.py3-none-any.whl (394 kB)
|████████████████████████████████| 394 kB 21.3 MB/s
Downloading cup-3.19.0-py2.py3-none-any.whl (394 kB)
|████████████████████████████████| 394 kB 26.2 MB/s
Downloading cup-3.18.0-py2.py3-none-any.whl (393 kB)
|████████████████████████████████| 393 kB 22.1 MB/s
Downloading cup-3.17.0-py2.py3-none-any.whl (382 kB)
|████████████████████████████████| 382 kB 23.8 MB/s
Downloading cup-3.16.0-py2.py3-none-any.whl (376 kB)
|████████████████████████████████| 376 kB 27.5 MB/s
Downloading cup-3.15.1-py2.py3-none-any.whl (385 kB)
|████████████████████████████████| 385 kB 30.4 MB/s
INFO: pip is looking at multiple versions of this package to determine
which version is compatible with other requirements.
This could take a while.
Downloading cup-3.15.0-py2.py3-none-any.whl (378 kB)
|████████████████████████████████| 378 kB 21.4 MB/s
Downloading cup-3.14.0-py2.py3-none-any.whl (372 kB)
|████████████████████████████████| 372 kB 21.1 MB/s - pip会持续回退,不知道会回退多少次,直到找到一个没有冲突的版本。。
持续下载历史安装包很多次,可能会等很久,解决方法有以下几个:
- 使用
ctrl+c手动暂停下载。(这并不解决问题) - 指定冲突依赖库的版本。如果未能安装成功,pip将抛出错误信息指明哪些安装包冲突,有利于开发者修复。(博主最终也是通过这个方法发现冲突的依赖库)
1
python -m pip install tea "cup >= 3.13" - 在安装包的依赖文件中处理好依赖,指明依赖库的版本,避免在安装时发生依赖冲突。可使用pip-tools工具生成合格的
requirement.txt文件。1
2python -m pip install pip-tools
python -m piptools compile
问题延展
在上面的步骤二,找到了冲突文件后,应该怎么解决呢?例如类似下面的报错信息:
1 | |
可以看到在安装package_coffee和package_tea时指定了版本,但是报错package_water依赖项有版本冲突。这时我们只能寻找两个依赖库都不对package_water冲突的版本。寻找方法为:
放宽安装包的版本,例如package_coffee>0.44,package_tea>4.0.0,这时pip将自动寻找同时满足package_water的安装包版本。
- package_coffee 0.44.1, which depends on package_water 2.6.1
- package_tea 4.4.3 which also depends on package_water 2.6.1
这时我们再执行安装
1 | |
如果你想优先指定某个安装库的版本,可以这样执行:
1 | |