环境
这也是使用docker run python:3
复制的。
描述
如果约束文件指定了不兼容的版本,pip 会安装一个依赖项损坏的包。 显示错误消息,但退出代码为0
。
例如, environs 5.2.1
需要marshmallow>=2.7.0
,但如果后者在约束文件中指定,pip 会使用marshmallow 2.6.0
安装它。
预期行为
pip 不应安装该软件包,并以失败退出。
如何繁殖
marshmallow==2.6.0
创建约束environs==5.2.1
创建 requirements.txtpip install -r requirements.txt -c constraints.txt
输出
$ docker run --rm -ti python:3 sh
# python -V
Python 3.7.4
# pip -V
pip 19.2.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
# uname -a
Linux 4d4f16cc965f 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 GNU/Linux
# echo marshmallow==2.6.0 > constraints.txt
# echo environs==5.2.1 > requirements.txt
# pip install -r requirements.txt -c constraints.txt
Collecting environs==5.2.1 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/5f/c9/6b576b8b374dfe78d9435988e6a53497822f31b9da5bdd446343ad1a4d1b/environs-5.2.1-py2.py3-none-any.whl
Collecting marshmallow==2.6.0 (from -c constraints.txt (line 1))
Downloading https://files.pythonhosted.org/packages/33/44/c3bdd4222909b6452ebe5c028ea5dbe7e9409307b3b933026218c677fcf1/marshmallow-2.6.0-py2.py3-none-any.whl (44kB)
|████████████████████████████████| 51kB 729kB/s
Collecting python-dotenv (from environs==5.2.1->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/57/c8/5b14d5cffe7bb06bedf9d66c4562bf90330d3d35e7f0266928c370d9dd6d/python_dotenv-0.10.3-py2.py3-none-any.whl
ERROR: environs 5.2.1 has requirement marshmallow>=2.7.0, but you'll have marshmallow 2.6.0 which is incompatible.
Installing collected packages: marshmallow, python-dotenv, environs
Successfully installed environs-5.2.1 marshmallow-2.6.0 python-dotenv-0.10.3
# echo $?
0
这与#988 基本相同(另见:#5137)。
Pip 在第一次遇到的基础上计算出要求(尽管这可能会在没有通知的情况下发生变化)。 当需求文件和约束文件被解析时,我们最终以environs==5.2.1
作为需求和marshmallow==2.6.0
作为约束。 当environs
被处理时, marshmallow
被视为一个依赖项,并且现有的条目 ( marshmallow==2.6.0
) 被标记为一个要求,并且现有的版本是用于安装的版本. 我认为使用用户提供的值(即使只是作为约束)可能是我们在这里可以拥有的最正确的行为。
跟踪的错误与为普通pip install environs==5.2.1 marshmallow==2.6.0
或单独调用(如pip install environs==5.2.1 && pip install marshmallow==2.6.0
)跟踪的错误相同。
这是在 #5000 中添加的。 退出代码不是 1 的原因是向后兼容。
如果您想以编程方式知道这种情况正在发生,您需要运行pip check
。
此问题已自动关闭,因为我们要求原作者提供更多信息的请求没有得到回应。 只有当前问题中的信息,我们没有足够的信息来采取行动。 如果您有或找到我们需要的答案,请联系我们,以便我们进一步调查。