2015年11月15日

バージョンチェック

ソースコードを書いていると、インストールされている Python のバージョンによる場合分けが必要となることがあります。その方法について紹介します。


Pythonのバージョンに関する情報は、sys モジュールの version と version_info に含まれています。

>>> import sys

>>> sys.version
'3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)]'

>>> sys.version_info
sys.version_info(major=3, minor=4, micro=0, releaselevel='final', serial=0)

ソースコードとして扱いやすいのは sys.version_info の方になります。
以下はバージョンチェックを行う関数と、その簡単な使用例です。
# 便利関数を定義
>>> def or_later(major, minor=0, micro=0):
...     import sys
...     return sys.version_info >= (major, minor, micro)

# 3.0.0以上ならxrangeを定義
>>> if or_later(3):
...     xrange = range


これでめでたくバージョンチェックができるわけですが、注意点が2つあります。

① Python 3.0 と 3.1
こちらで述べた通り、Python 3.0 と 3.1 のリリースはやや特殊です。2.7 に含まれているけど 3.0 と 3.1 には含まれていない、という機能があることに注意して下さい。

② バージョンが全てではない
訳あって古いバージョンのPythonが使われていても、モジュールによっては個別にインストール可能です。
私が実際に経験した失敗談なのですが、プログラムに argparse(Python 2.7 で追加された)を使っていたので or_later(2, 7) と場合分けしていたら、Python 2.6 の環境に自力で argparse をインストールしている人がいて、プログラム自体は動作可能なのにバージョンチェックで停止してしまっていた、ということがありました。

つまり、特定のモジュールが含まれているかで場合分けするなら、

if or_later(2, 7):
    pass
else:
    print('argparse module is required')
    sys.exit()
とバージョンで場合分けするよりも
try:
    import argparse
except ImportError:
    print('argparse module is required')
    sys.exit()
と書く方が、汎用性の観点から優れている、ということになります。

0 件のコメント:

コメントを投稿