Python 当一个包指定一个范围而另一个包不指定';T
我有一个requirement.txt,只有两个依赖项:Python 当一个包指定一个范围而另一个包不指定';T,python,pip,setuptools,install-requires,Python,Pip,Setuptools,Install Requires,我有一个requirement.txt,只有两个依赖项: sentry-sdk==0.7.11 requests==2.21.0 我已经检查了这两个包的setup.py,它们都依赖于urllib3: 请求提供了一个不接受1.25的范围 sentry sdk没有指定特定的版本或范围 最近,当我使用pip安装依赖项时,发布了urllib3(1.25)的新版本。我收到以下错误: ERROR: requests 2.21.0 has requirement urllib3<1.25,>
sentry-sdk==0.7.11
requests==2.21.0
我已经检查了这两个包的setup.py,它们都依赖于urllib3:
- 请求提供了一个不接受1.25的范围
- sentry sdk没有指定特定的版本或范围
ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
ERROR:requests 2.21.0的要求urllib3=1.21.1,但您的要求urllib3 1.25不兼容。
这是预期的行为还是pip中的错误
在install\u requires中不指定依赖项版本的含义是什么?“强制更新最新版本” 您观察此行为的原因是因为pip首先安装
sentry sdk
。因为它没有版本约束,所以您得到的是最新版本(1.25)。如果要安装请求
,则此版本不兼容
解决这个问题的唯一方法是全局解决所有版本约束,而AFAIK pip无法做到这一点
解决方案是在requirements.txt中指定所需的urllib3版本(因为您知道所使用的依赖项的版本)。对于没有约束的瞬态包来说,这可能是一个很好的实践
实际上,使用pip进行可复制构建的方法是始终这样做
pip freeze > requirements.txt
并检查结果。这样,第三方软件包更新不会破坏您的构建,您可以随时在以后手动升级(并签入结果)。我还尝试使用pipenv(-r标志)安装依赖项,看起来pipenv能够处理依赖项解析。我想我是在期待pip提供一些它实际上没有提供的东西。显然,pip只能检测冲突,而且pip还有“check”命令。在冷冻前,检查是否存在问题可能是个好主意。