Fut*_*get 10 python pip requirements.txt python-packaging
我正在尝试寻找是否有办法获取已安装的软件包和版本并检查它是否满足要求规范。
例如,如果我有包 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
Run Code Online (Sandbox Code Playgroud)
我发现 pkg_resources.extern.packaging 有 version.parse,这对于比较大于或小于的不同版本很有用,但要求规范可能非常复杂,并且有像 ~= 这样的运算符不是标准数学运算符。
setuptools 文档有这个例子:
PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
Run Code Online (Sandbox Code Playgroud)
是否有现有的方法可以进行此检查,或者有一种简单的方法可以让我自己进行检查?
编辑: ~= 特别困难,特别是当规格作为变量输入时。* 版本要求也很难弄清楚,因为
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
Run Code Online (Sandbox Code Playgroud)
使用pkg_resources(来自 setuptools)作为 API 现已弃用,并且会在导入时导致警告:
$ python3 -W always -c 'from pkg_resources import Requirement'
<string>:1: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
Run Code Online (Sandbox Code Playgroud)
packaging相反,我们可以使用(pkg_resources无论如何在内部使用)来解析需求。检查需求名称是否与相等比较匹配,并使用以下命令检查需求版本是否在说明符集中in:
>>> from packaging.requirements import Requirement
>>> req = Requirement("pip~=20.0.0")
>>> pin = "pip==20.0.2"
>>> name, version = pin.split("==")
>>> name == req.name and version in req.specifier
True
Run Code Online (Sandbox Code Playgroud)
发布后工作。必须明确选择预发布。
>>> "20.0.0post1" in req.specifier
True
>>> req.specifier.contains("20.0.1b3")
False
>>> req.specifier.contains("20.0.1b3", prereleases=True)
True
Run Code Online (Sandbox Code Playgroud)
注意:顶级安装的版本可能与pip 供应商packaging和内部使用的打包版本不同。如果您需要保证打包 API 与 pip 的行为完全匹配,您可以直接从 pip 的供应商子包中导入类型:Requirement
from pip._vendor.packaging.requirements import Requirement
Run Code Online (Sandbox Code Playgroud)
或者,如果从私有子模块导入让您感到害怕,请在顶层安装包装到与您的 pip 版本当前供应的完全相同的版本。检查您的 pip 版本(带有pip --version),然后检查 pip 供应商对应的包装版本。例如,如果您的 pip 版本是 23.2.1,您可以签入:
https://github.com/pypa/pip/blob/23.2.1/src/pip/_vendor/vendor.txt
在这里您将看到 pip==23.2.1 在打包==21.3 处提供了旧版本。
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |