当前位置: 首页 > 面试题库 >

如何比较Python中的版本号?

曹季同
2023-03-14
问题内容

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

我有一个正则表达式·可以从文件名中提取名称和版本。问题是比较版本号,它是一个类似的字符串2.3.1。

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

>>> "2.3.1" > "10.1.1"
True

我可以进行一些拆分解析,转换为int等操作,最终得到解决方法。但这是Python,而不是Java。有没有比较版本字符串的优雅方法?


问题答案:

使用packaging.version.parse。

>>> 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'

·是第三方实用程序,但是由setuptools使用(因此你可能已经安装了它)并且符合当前的PEP 440;packaging.version.Version如果版本兼容,则返回,否则返回packaging.version.LegacyVersion。后者将始终在有效版本之前排序。

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未记录的,这里是相关的文档字符串。



 类似资料:
  • 我正在浏览一个包含鸡蛋的目录,以将这些鸡蛋添加到。如果目录中有同一个.egg的两个版本,我只想添加最新版本。 我有一个正则表达式

  • 问题内容: 我想写一个样功能,比较两个版本号,并返回,或根据自己的比较valuses。 如果版本A早于版本B,则返回 返回如果版本A和B是等价的 如果版本A比版本B更新,则返回 每个小节都应解释为一个数字,因此1.10> 1.1。 所需的功能输出为 这是我的实现,有待改进: 我正在使用Python 2.4.5 btw。(安装在我的工作地点…)。 这是您可以使用的小型“测试套件” 问题答案: 删除字

  • 问题内容: 是否有用于比较版本号的标准习语?我不能只使用直接的String compareTo,因为我尚不知道最大的点释放数将是多少。我需要比较版本,并满足以下条件: 问题答案: 用点作为定界符标记字符串,然后从左侧开始并排比较整数转换。

  • 问题内容: 我的表中有固件版本字符串(例如“ 4.2.2”或“ 4.2.16”) 如何比较,选择或排序它们? 我无法使用标准字符串比较:SQL看到的“ 4.2.2”大于“ 4.2.16” 作为版本字符串,我希望4.2.16大于4.2.2 我想考虑一下固件版本中可以包含chars的原因:4.24a1、4.25b3 …为此,通常,具有chars的子字段具有固定的长度。 如何进行 ? 问题答案: 最终,

  • 软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4 会比 2.6.12 大;也不能进行数字比较, 因为它们不是有效地数字。 Puppet 的 versioncmp 函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的: ve

  • 问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个