在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 ...
随机推荐
- Rust如何引入源码作为依赖
问题描述 通常我们在rust项目中引入第三方依赖包时,会直接指定包的版本,这种方式指定后,Cargo在编译时会从crates.io这个源中下载这些依赖包. [package] name = " ...
- union()并集intersection()交集difference()差集
union并集,即:合并 intersection()交集 difference()差集 qs1=Course.objects.filter(price__get=240) qs2=Course.ob ...
- javascript5 定时器功能
定时器功能: 定时器功能是window对象方法,涉及到 定时器和延时器,具体 看代码 定时器 timer=setInterval(function (){},300) 清除定时器: clearInte ...
- odoo开发教程十二:web controlle
一:路由 odoo.http.route(route=None, **kw) 装饰器可以将对应方法装饰为处理对应的http请求,该方法须是Controller的子类. route -- 字符串或数组, ...
- redis.conf 7.0 配置和原理全解,生产王者必备
5.5 redis.conf 配置详解 我是 Redis, 当程序员用指令 ./redis-server /path/to/redis.conf 把我启动的时候,第一个参数必须是redis.conf ...
- 5.5. Java并发工具类(如CountDownLatch、CyclicBarrier等)
5.5.1 CountDownLatch CountDownLatch是一个同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作.CountDownLatch有一个计数器,当计数器减为0时, ...
- GLIBC 升级安装与 SCL 知识盲区
前言 glibc 是 GNU 发布的 libc 库,即 c 运行库.glibc 是 linux 系统中最底层的 api,几乎其它任何运行库都会依赖于 glibc.glibc 除了封装 linux 操作 ...
- 发现了阿里云 APP 的一个小 BUG
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 前几天在华为手机上使用阿里云 APP,从 oss bucket 中下载了一张图片,想要通过微信 ...
- x.ai还是OpenAI?埃隆·马斯克的AI帝国【2】
上期内容咱们提到了埃隆马斯克的特斯拉是自动驾驶领域的领导者,大家可能近些年也都有从各类渠道听到过Tesla自动驾驶有关的新闻.不同于像包括Google子公司Waymo在内的大多数使用激光雷达来实现自动 ...
- Elastaticsearch 集群部署
系统Ubuntu 16.04 Elastaticsearch 5.6.9 Kibana 5.6.9 官网地址 https://www.elastic.co/products/elasticsearch ...