为什么 Pip 声称某个 Python 版本不在给定范围内?

mip*_*adi 17 python pip python-3.x

我使用的是 Python 3.8.7 和最新版本的 Pip,v21.0.1。我编写了一个包含以下 Python 版本约束的包:

python_requires='>=3.6, <3.9',
Run Code Online (Sandbox Code Playgroud)

当我尝试安装该软件包时,Pip 拒绝并打印以下错误:

ERROR: Package 'my-package' requires a different Python: 3.8.7 not in '<3.9,>=3.6'
Run Code Online (Sandbox Code Playgroud)

在安装具有类似版本限制的其他软件包时,我看到了类似的错误:

ERROR: Package 'my-other-package' requires a different Python: 3.8.7 not in '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.9,>=2.7'
Run Code Online (Sandbox Code Playgroud)

显然 Python 3.8.7大于3.6 且小于 3.9,那么为什么 Pip 声称需要不同版本的 Python?


一些调查表明这可能是一条不准确的错误消息。我已经运行了一个实验,使用具有以下依赖关系的包:

  • package-a 需要 Python >= 3.6,并且依赖于 package-b;
  • package-b 需要 Python >= 3.6 且 < 3.9。

我发现使用 Python 3.9 安装 package-a 时,收到以下错误:

ERROR: Package 'package-a' requires a different Python: 3.9.0 not in '>=3.6'
Run Code Online (Sandbox Code Playgroud)

所以基本上,package-a 不能与 Python 3.9 一起安装,因为 package-b 不适用于 Python 3.9;然而,Pip 错误地指出package-a需要“不同的”Python,然后错误地打印出 package-a 的版本说明符,而不是 package-b。

我会继续调查,但这可能是 Pip 本身的一个错误。

a_g*_*est 11

这是 21.1 版本中的一个错误pip,并已在版本21.1中修复(请参阅#9541)。具体来说,当解析失败时,它在错误消息中包含错误的 Python 约束(依赖项之一)。