如何比较 Python 中的版本号?

2024-04-18

我正在遍历一个包含鸡蛋的目录,将这些鸡蛋添加到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 https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java。有没有一种优雅的方法来比较版本字符串?


Use packaging.version.parse https://packaging.pypa.io/en/latest/version.html#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是第三方实用程序,但使用者设置工具 https://pypi.python.org/pypi/setuptools(所以您可能已经安装了它)并且符合当前的PEP 440 https://www.python.org/dev/peps/pep-0440/;它将返回一个packaging.version.Version如果版本兼容并且packaging.version.LegacyVersion如果不。后者总是排序在有效版本之前。

Note: 包装最近提供给 setuptools https://github.com/pypa/setuptools/tree/a94ccbf404a79d56f9b171024dee361de9a948da/pkg_resources/_vendor/packaging.


一个古老而现已弃用 https://www.python.org/dev/peps/pep-0632/你可能遇到的方法是distutils.version http://docs.python.org/distutils/apiref.html#module-distutils.version,它没有记录,仅符合被取代的PEP 386 http://www.python.org/dev/peps/pep-0386/;

>>> 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 关于有效版本的概念不符。

As distutils.version是无证的,here https://github.com/python/cpython/blob/main/Lib/distutils/version.py是相关的文档字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较 Python 中的版本号? 的相关文章

随机推荐