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是相关的文档字符串。