ちょっとしたスクリプトをPythonで作成しようとしてて、バージョン番号の比較をさせる必要があったので備忘として残しておく。 Pythonでバージョン番号の比較を行う場合は、以下の2つの方法があるようだ。

1. 『distutils.version』を用いる

『distutils.version』を利用することで、バージョン番号の比較が行えるようだ。 以下のようにインポートして関数を利用、比較してやれば良いようだ。

比較用の関数は2つ用意されており、「StrictVersion」と「LooseVersion」が利用できる。 アルファベットを含むような、数字だけではないバージョン番号(rcとか)を比較する場合は「LooseVersion」を使うとよい。 (なお、混在させると正常に動作しないので注意。比較時は必ず同じ関数を使うこと)

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... from distutils.version import LooseVersion, StrictVersion
>>>
>>> # Trueが返ってくる
... print(StrictVersion('11.0') > StrictVersion('10.4.2'))
True
>>>
>>> # Flaseが返ってくる
... print(StrictVersion('9.0') > StrictVersion('10.4.2'))
False
>>>
>>> # Trueが返ってくる
... LooseVersion('1.5c2') > LooseVersion('1.5')
True

2. 『pkg_resources』を用いる

「1.7-rc2」など、テスト版と正式リリース版で比較できるようにする場合は、「pkg_resources」を用いてやるといいようだ。 ライブラリはpipで以下のようにインストールできる。

pip install distribute

以下、実行例。

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... from distutils.version import LooseVersion, StrictVersion
>>> from pkg_resources import parse_version
>>>
>>> # Flaseが返ってくる
... LooseVersion('1.5') > LooseVersion('1.5-rc3')
False
>>>
>>> # Trueが返ってくる
... parse_version('1.5') > parse_version('1.5-rc3')
True

3. 『packaging.version.parse』を用いる

もしくは、setuptoolsのインストールとともについてくる『packaging.version.parse』を用いることでも、バージョンの比較が可能だ。 setuptoolsのインストールをしていない場合orインストールしたくない場合、以下のようにpipでライブラリだけインストールしてやるといい。

pip install packaging

以下、実行例。

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from packaging import version
>>> version.parse("0.1") < version.parse("1.0.2") True >>> version.parse("1.3.a") < version.parse("1.2.2")
False

参考