在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 ...
随机推荐
- 2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限
2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"], ...
- 2022-08-25:以下go语言代码输出什么?A:1 0;B:1 2;C:不能编译;D:0 0。 package main import “fmt“ func named() (n, _ int
2022-08-25:以下go语言代码输出什么?A:1 0:B:1 2:C:不能编译:D:0 0. package main import "fmt" func named() ( ...
- docker无法启动,报错grpc: addrConn.createTransport failed to connect to {unix:///run/containerd/containerd.
docker无法启动,报错.k8s的pod镜像加载失败. 解法方法: 删除/var/lib/docker/和/var/lib/containerd/ 这两个文件夹,重起docker服务. 问题完美解决 ...
- 2020-12-25:MQ中,如何保证消息的顺序性?
福哥答案2020-12-25:[稍微详细的答案:](http://bbs.xiangxueketang.cn/question/875)生产者保证消息入队的顺序.MQ 本身是一种先进先出的数据接口,将 ...
- 2021-04-22:给定很多线段,每个线段都有两个数[start, end],表示线段开始位置和结束位置,左右都是闭区间,规定:1)线段的开始和结束位置一定都是整数值,2)线段重合区域的长度必须>=
2021-04-22:给定很多线段,每个线段都有两个数[start, end],表示线段开始位置和结束位置,左右都是闭区间,规定:1)线段的开始和结束位置一定都是整数值,2)线段重合区域的长度必须&g ...
- 使用 MRKL 系统跨越神经符号鸿沟
本文展示了自然语言处理的下一步发展--模块化推理.知识和语言( the Modular Reasoning, Knowledge and Language,简称为MRKL)系统以及LangChain和 ...
- C# 中的“智能枚举”:如何在枚举中增加行为
目录 枚举的基本用法回顾 枚举常见的设计模式运用 介绍 智能枚举 代码示例 业务应用 小结 枚举的基本用法回顾 以下是一个常见的 C# 枚举(enum)的示例: enum Weekday { Mond ...
- @GrpcServise 注解的作用和使用
转载请注明出处: 1. @GrpcServise 的作用和优势 在没有使用 @GrpcServise 注解编写服务端时,我们通常需要自定义 Server 以及端口,包括 start,stop ,注册s ...
- P1751 贪吃虫 题解
题意: 题目传送门 在一棵 n 个结点的树上,有 k 个贪吃虫去吃食物. 每个贪吃虫都走到达食物的唯一路径. 当一条贪吃虫通向食物的道路上有另一条贪吃虫,则较远的那只停止移动. 多条贪吃虫要进入同一节 ...
- 沉思篇-剖析Jetpack的LiveData
上一篇我们讲到了架构组件中的Lifecycle,由于缺少具体的运用,可能缺少直观的感受,今天我们就用Lifecycle实战一回,看看Lifecycle是怎样运用到LiveData中的. LiveDat ...