python - 有没有办法以编程方式确认 python 包版本满足需求说明符?

标签 python pip python-packaging requirements.txt

我试图找出是否有办法获取已安装的软件包和版本并检查它是否满足要求规范。

例如,如果我有 pip==20.0.2 包,我希望程序执行以下操作:

CheckReqSpec("pip==20.0.2", "pip>=19.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip<=20.1")    -> True
CheckReqSpec("pip==20.0.2", "pip~=20.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip>20.0.2")   -> False

我发现 pkg_resources.extern.packaging 有 version.parse,这对于比较大于或小于的不同版本很有用,但需求规范可能非常复杂,并且有像 ~= 这样的运算符不是标准的数学运算符。

setuptools 文档有这个例子:
PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1

是否有一种现有的方法可以进行此检查,或者有一种简单的方法可以自己制作?

编辑:
~= 特别困难,特别是如果规范作为变量输入。 * 在版本要求中也很难弄清楚,因为
 version.parse("20.0.*") == version.parse("20.0.1") # False
 version.parse("20.0.*") < version.parse("20.0.0")  # True 
 version.parse("20.0.*") < version.parse("20.1.1")  # True 
 version.parse("20.0.*") >= version.parse("20.0.0") # False

最佳答案

使用 setuptools 解析说明符集,然后使用 in 检查成员资格。 :

>>> from pkg_resources import Requirement
>>> req = Requirement.parse("pip~=20.0.0")
>>> pin = "pip==20.0.2"
>>> name, version = pin.split("==")
>>> name == req.name and version in req.specifier
True

发布发布工作。必须明确选择预发布。
>>> "20.0.0post1" in req.specifier
True
>>> req.specifier.contains("20.0.1b3")
False
>>> req.specifier.contains("20.0.1b3", prereleases=True)
True

关于python - 有没有办法以编程方式确认 python 包版本满足需求说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61883438/

相关文章:

python - Django PasswordResetView - 在哪里可以找到实际发送电子邮件的代码?

Python 和 pip,列出可用包的所有版本?

python - 如何指定 Python 包的外部系统依赖项?

python - 用于文本分类的预训练模型

python - 是什么构成了 python 元组?

Python import_array 使得无法使用 ctrl-c 杀死嵌入式 python

docker - 每次修改代码时如何防止 Docker 重新运行 pip 安装

python - 如何从 docker-compose 安装 requirements.txt?

python - 无法显示带有点击入口点的 Python 二进制 PEX 版本