为了账号安全,请及时绑定邮箱和手机立即绑定

如何比较Python中的版本号?

如何比较Python中的版本号?

回首忆惘然 2019-07-19 18:23:20
如何比较Python中的版本号?我正在浏览一个包含鸡蛋的目录,以便将这些鸡蛋添加到sys.path..如果目录中有两个版本相同的.EGG,我只想添加最新的版本。我有一个正则表达式r"^(?P<eggName>\w+)-(?P<eggVersion>[\d\.]+)-.+\.egg$若要从文件名中提取名称和版本,请执行以下操作。问题是比较版本号,它是一个字符串,类似2.3.1.因为我在比较字符串,在10上面有2种类型,但是对于版本来说这是不正确的。>>> "2.3.1" > "10.1.1"True我可以做一些拆分、解析、转换为int等等,最终我会找到一个解决办法。但这是Python不是Java..有没有一种比较版本字符串的优雅方法?
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

setuptools定义parse_version()..这个工具Pep 0440-版本识别并且还能够解析不遵循PEP的版本。此函数由easy_installpip若要处理版本比较,请执行以下操作。从博士:

解析了PEP 440定义的项目版本字符串。返回的值将是一个表示版本的对象。这些对象可以相互比较和排序。排序算法是由PEP 440定义的,另外,任何不是有效PEP 440版本的版本都将被认为小于任何有效的PEP 440版本,无效版本将继续使用原始算法进行排序。

引用的“原始算法”是在PEP 440存在之前在旧版本的docs中定义的。

在语义上,这种格式是distutils‘StrictVersionLooseVersion类;如果您提供的版本将与StrictVersion然后他们会用同样的方式进行比较。否则,比较更像是一种“更聪明”的LooseVersion..可以创建病态版本编码方案来欺骗这个解析器,但是在实践中它们应该是非常罕见的。

这个文献资料提供一些示例:

如果您想确定所选的编号方案按照您认为的方式工作,则可以使用pkg_resources.parse_version()函数来比较不同的版本号:

>>> from pkg_resources import parse_version>>> parse_version('1.9.a.dev') == parse_version('1.9a0dev')True>>> parse_version('2.1-rc2') < parse_version('2.1')True>>> parse_version('0.6a9dev-r41475') < parse_version('0.6a9')True

如果不使用setuptools,则包装项目将此功能和其他与打包相关的功能拆分到一个单独的库中。

from packaging import version
version.parse('1.0.3.dev')from pkg_resources import parse_version
parse_version('1.0.3.dev')


查看完整回答
反对 回复 2019-07-19
?
BIG阳

TA贡献1859条经验 获得超6个赞

将版本字符串转换为元组并从那里开始有什么问题?对我来说很优雅

>>> (2,3,1) < (10,1,1)True>>> (2,3,1) < (10,1,1,1)True>>> (2,3,1,10) < (10,1,1,1)True>>> (10,3,1,10) < (10,1,1,1)False>>> (10,3,1,10) < (10,4,1,1)True


查看完整回答
反对 回复 2019-07-19
  • 2 回答
  • 0 关注
  • 869 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信