在Python中使用LooseVersion进行软件版本号比对
技术背景
Python是一门极其热门、极其灵活的开发语言,其更新迭代的速度也非常的快速。有时候我们遇到不同的软件版本不同方法处理的情况,此时就需要用到版本号比对的工具。举一个例子说,我们要在python代码中区分numpy版本在1.21.6之前和之后的版本。虽然我们可以自己手写一个软件版本号识别和比对的简单函数,但是相比之下,LooseVersion的方案会更加的成熟和方便一些。本文主要介绍LooseVersion的一些相关使用场景。
查看软件版本号
在python中我们可以使用两种方法来获取一个软件的版本号。如果是在命令行下,我们可以使用pip来查看版本号:
$ python3 -m pip show numpy
Name: numpy
Version: 1.21.6
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email:
License: BSD
Location: /home/dechin/anaconda3/envs/mindspore-latest/lib/python3.7/site-packages
Requires:
Required-by: torchvision, torch, tensorboard, numba, netCDF4, gsd, GridDataFormats, cftime, Xponge, xarray, silx, scipy, scikit-learn, rdkit, pandas, mindspore, mindspore-cuda11-dev, matplotlib, h5py, fabio, biotite, biopython
而如果是在python程序的内部,我们需要通过package.__version__来进行查看:
In [1]: import numpy as np
In [2]: np.__version__
Out[2]: '1.21.6'
上面的python案例在ipython模式下运行。
LooseVersion的使用
LooseVersion(version)可以直接用于比较大小,比如LooseVersion(version2)>LooseVersion(version1),会返回一个布尔值,其引用方法如下:
In [1]: from distutils.version import LooseVersion
In [2]: import numpy as np
In [3]: LooseVersion(np.__version__) >= LooseVersion('1.21.6')
Out[3]: True
其返回值为真,表示当前的numpy版本号是更新的。除了标准的版本号比对之外,还可以进行一些错位的比对:
# 末位版本号领先
In [4]: LooseVersion('1.21.6') >= LooseVersion('1.21.0')
Out[4]: True
# 中间位版本号落后
In [5]: LooseVersion('1.21.6') >= LooseVersion('1.22.0')
Out[5]: False
# 多一位版本号表示领先
In [6]: LooseVersion('1.21.6') >= LooseVersion('1.21')
Out[6]: True
# 落后一个alpha迭代版本
In [7]: LooseVersion('1.21.6') >= LooseVersion('1.21.6a')
Out[7]: False
# 多两位版本号领先
In [8]: LooseVersion('1.21.6') >= LooseVersion('1')
Out[8]: True
# 首位版本号落后
In [9]: LooseVersion('1.21.6') >= LooseVersion('2')
Out[9]: False
应该说LooseVersion的功能基本涵盖了版本号演化的大部分规则,在实际场景中使用Python内置的LooseVersion可能会比自己写一个版本比对算法更加来的方便。
总结概要
在软件版本快速迭代的过程中,经常会遇到一些接口变化问题。而如果需要兼容旧版本的话,就需要使用到版本判断的方法。判断清楚版本号属于哪一个区间,再对不同的版本号区间采取不同的算法或者执行策略。Python中预先内置的LooseVersion就是一个很好的版本号比对工具,不仅仅可以对相同位数或者相同类型的版本号进行比对,还可以进行错位的版本号比对。当然,需要注意的是,LooseVersion中对于输入的版本号类型还是有要求的,比如版本号中的每一位的开头必须是一个数字,版本号的每一位都不能以字母开头,否则无法进行比对。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/loose-version.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
CSDN同步链接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343
51CTO同步链接:https://blog.51cto.com/u_15561675
在Python中使用LooseVersion进行软件版本号比对的更多相关文章
- python中协程
在引出协成概念之前先说说python的进程和线程. 进程: 进程是正在执行程序实例.执行程序的过程中,内核会讲程序代码载入虚拟内存,为程序变量分配空间,建立 bookkeeping 数据结构,来记录与 ...
- python中软件开发规范,模块,序列化随笔
1.软件开发规范 首先: 当代码都存放在一个py文件中时会导致 1.不便于管理,修改,增加 2.可读性差 3.加载速度慢 划分文件1.启动文件(启动接口)--starts文件放bin文件里2.公共文件 ...
- 精通 Oracle+Python,第 9 部分:Jython 和 IronPython — 在 Python 中使用 JDBC 和 ODP.NET
成功的编程语言总是会成为顶级开发平台.对于 Python 和世界上的两个顶级编程环境 Java 和 Microsoft .NET 来说的确如此. 虽然人们因为 Python 能够快速组装不同的软件组件 ...
- 如何在python中使用Elasticsearch
什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说 ...
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- Python中出现的异常
简单的写几种我知道的关于Python中出现的异常含义,希望大神批评指正,我只是学软件开发的菜鸟,前面的路还很长,我会努力学习! 什么是异常? 异常既是一个事件,该事件会在程序执行过程中发生,影响了程序 ...
- Python中的字符串与字符编码
本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章. ...
- python中的编码问题:以ascii和unicode为主线
1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8 ...
- Python中如何读取xls中的数据
要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd 安装方法:下载解压后,利用windows dos命令进入解压目录eg,c ...
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
随机推荐
- 2020-10-16:CAS知道么?底层实现? 会引发什么问题?如何解决ABA问题?
福哥答案2020-10-16:#福大大架构师每日一题# 简单回答:cmpxchg原子指令.aba,循环开销大,一个共享变量. [知乎](https://www.zhihu.com/question/4 ...
- 2022-04-08:在一张 无向 图上,节点编号0~N-1。老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞, 老鼠第先出发,猫后出发,轮流行动。 在每个玩家的行动中,他们 必须 沿着图中与所
2022-04-08:在一张 无向 图上,节点编号0~N-1.老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞, 老鼠第先出发,猫后出发,轮流行动. 在每个玩家的行动中,他们 必须 沿着图中与所 ...
- 2021-11-30:给定一个数组arr,当拿走某个数a的时候,其他所有的数都+a, 请返回最终所有数都拿走的最大分数。 比如: [2,3,1], 当拿走3时,获得3分,数组变成[5,4]; 当拿走5
2021-11-30:给定一个数组arr,当拿走某个数a的时候,其他所有的数都+a, 请返回最终所有数都拿走的最大分数. 比如: [2,3,1], 当拿走3时,获得3分,数组变成[5,4]: 当拿走5 ...
- MySQL的varchar存储原理:InnoDB记录存储结构
摘要:varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实 ...
- Django context must be a dict rather than UserProfile.
context must be a dict rather than UserProfile. # 主页@login_requireddef index(request): data={} data ...
- npm install报错node-sass@7.0.1 postinstall: `node scripts/build.js`
在控制台执行 即可 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
- # 代码随想录算法训练营Day31 贪心算法| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
代码随想录算法训练营 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 ...
- Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍
fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...
- Kotlin协程-那些理不清乱不明的关系
Kotlin的协程自推出以来,受到了越来越多Android开发者的追捧.另一方面由于它庞大的API,也将相当一部分开发者拒之门外.本篇试图从协程的几个重要概念入手,在复杂API中还原出它本来的面目,以 ...
- 使用 Sa-Token 实现 [记住我] 模式登录、七天免登录
一.需求分析 如图所示,一般网站的登录界面都会有一个 [记住我] 按钮,当你勾选它登录后,即使你关闭浏览器再次打开网站,也依然会处于登录状态,无须重复验证密码: 本文将详细介绍在 Sa-Token中, ...