python - 如何比较 Python 中的版本号?

我正在浏览一个包含鸡蛋的目录,以将这些鸡蛋添加到 sys.path .如果目录中有同一个.egg的两个版本,我只想添加最新的。

我有一个正则表达式 r"^(?P<eggName>\w+)-(?P<eggVersion>[\d\.]+)-.+\.egg$从文件名中提取名称和版本。问题是比较版本号,它是一个像 2.3.1 这样的字符串。 .

由于我在比较字符串,所以 2 排序高于 10,但这对于版本不正确。

>>> "2.3.1" > "10.1.1"
True

我可以做一些拆分、解析、转换为 int 等,最终我会得到一个解决方法。但这是 Python,not Java .有没有比较优雅的方法来比较版本字符串?

最佳答案

使用 packaging.version.parse .

>>> # pip install packaging
>>> from packaging import version
>>> version.parse("2.3.1") < version.parse("10.1.2")
True
>>> version.parse("1.3.a4") < version.parse("10.1.2")
True
>>> isinstance(version.parse("1.3.a4"), version.Version)
True
>>> isinstance(version.parse("1.3.xy123"), version.LegacyVersion)
True
>>> version.Version("1.3.xy123")
Traceback (most recent call last):
...
packaging.version.InvalidVersion: Invalid version: '1.3.xy123'

packaging.version.parse 是第三方实用程序,但被 setuptools 使用(所以您可能已经安装了它)并且符合当前的 PEP 440 ;如果版本兼容,它将返回 packaging.version.Version,如果不兼容,则返回 packaging.version.LegacyVersion。后者总是在有效版本之前排序。

注意:包装最近被 vendored into setuptools .


古和now deprecated您可能遇到的方法是distutils.version ,它是无证的,仅符合被取代的 PEP 386 ;

>>> from distutils.version import LooseVersion, StrictVersion
>>> LooseVersion("2.3.1") < LooseVersion("10.1.2")
True
>>> StrictVersion("2.3.1") < StrictVersion("10.1.2")
True
>>> StrictVersion("1.3.a4")
Traceback (most recent call last):
...
ValueError: invalid version number '1.3.a4'

如您所见,它将有效的 PEP 440 版本视为“不严格”,因此与现代 Python 的有效版本概念不符。

由于 distutils.version 未记录,here是相关的文档字符串。

https://stackoverflow.com/questions/11887762/

相关文章:

linux - fork()、vfork()、exec()和clone()的区别

linux - 增加 Linux 中 TCP/IP 连接的最大数量

python - 如何在正则表达式中使用变量?

python - 错误 : command 'gcc' failed with exit statu

python - 将 numpy dtypes 转换为原生 python 类型

linux - 对标准输入、标准输出和标准错误感到困惑?

linux - 遍历带有空格的文件列表

python - python - 如何按两列或多列对python pandas中的dataFram

linux - 如何在 Minikube 中使用本地 docker 镜像?

python - 如何避免 "RuntimeError: dictionary changed si