2018/01/24

Python Tips: Python のバージョンを確認したい

Python で、 Python 本体や利用ライブラリのバージョンを確認する方法をご紹介します。

お断り: 以下のコードの動作は MacOS 環境で確認しています。おそらく Ubuntu や CentOS 、 Windows 等でも同様ではないかと思いますが、 Mac 以外をお使いの方は「違いがあるかもしれない」という前提で参考にしてみてください。

以下、「ターミナルのコマンドで確認する方法」と「コードの中で確認する方法」の 2 つに分けてご説明していきます。

まずは目次です。

  • Python 本体のバージョンを確認する
    • ターミナルで確認する
    • コード内で確認する
  • ライブラリのバージョンを確認する
    • ターミナルで確認する
    • コード内で確認する

Python 本体のバージョンを確認する


ターミナルで確認する

Python のバージョンをターミナル上で確認するには、 python コマンドの --version オプションを利用します。

$ python --version 
Python 3.6.1

大文字の -V オプションも同じ意味になります。

$ python -V
Python 3.6.1

このオプションは 2 回重ねて指定することで、より詳細のビルド情報を確認することができます。

$ python --version --version
Python 3.6.1 (default, Apr  4 2017, 09:40:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

$ python -VV
Python 3.6.1 (default, Apr  4 2017, 09:40:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

ちなみに、少し紛らわしいですが、小文字の -v オプションも存在します。こちらは verbose (冗長な)を意味するオプションで、インポート処理等のトレース情報を出力してくれるモードを有効にしたいときに指定するものなので、バージョン表示とは無関係です。

コード内で確認する

続いて、コード内で確認する方法です。

コード内で確認する場合は sys.version_info を使うとよいでしょう。

import sys

print('Major version: {}'.format(sys.version_info.major))  # => 3
print('Minor version: {}'.format(sys.version_info.minor))  # => 6
print('Micro version: {}'.format(sys.version_info.micro))  # => 1

sys.version_infomajor minor micro などのアトリビュートにバージョン情報を格納したオブジェクトです(タプル型を継承した独自のクラスのオブジェクトのようです)。

また、 sys.version には、 Python のバージョンを表す文字列が格納されています。私の環境では、これはターミナルで python --version と打ったときに出力されるものと同じ文字列となっています。

import sys

print(sys.version)
# =>
# 3.6.1 (default, Apr  4 2017, 09:40:51)
# [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

この sys.version_infosys.version の使い分けですが、プログラムでバージョン情報を利用したい場合(メジャーバージョンによって分岐させたい場合など)には sys.version_info を、単純に人が確認するのに使いたい場合には sys.version の方を使うとよいかと思います。


ライブラリのバージョンを確認する


続いて、 Python 本体ではなくライブラリのバージョンを確認する方法についてです。

ターミナルで確認する

ターミナルでライブラリのバージョンを確認する方法としては、 Python3 で pip コマンドを使っている場合は、大きく分けて 2 通りの方法ーー「一覧でまとめて確認する方法」と「個別に確認する方法」があります( Anaconda などを使っている場合は未確認です)。

まず前者の「一覧でまとめて確認する方法」についてですが、こちらは pip のサブコマンド freeze または list を使用します。

pip freeze:

$ pip freeze 
alabaster==0.7.10
appnope==0.1.0
argh==0.26.2
astroid==1.4.5
attrs==17.2.0
...

pip list:

$ pip list --format=columns
Package           Version
----------------- ----------
alabaster         0.7.10
appnope           0.1.0
argh              0.26.2
astroid           1.4.5
attrs             17.2.0
...

特定のパターンにマッチするライブラリだけ知りたい場合は grep などで抽出するとよいでしょう。

$ pip list --format=columns | grep beautifulsoup
beautifulsoup4    4.6.0

list はさまざまなフォーマットをサポートしています。

$ pip list --format=json
[{"name": "alabaster", "version": "0.7.10"}, {"name": "appnope", "version": "0.1.0"}, {"name": "argh", "version": "0.26.2"}, {"name": "astroid", "version": "1.4.5"}, {"name": "attrs", "version": "17.2.0"}, ...

freezelist はよく似ていますが、両者にはおおよそ次のような違いがあります。

  • freeze は、 pip install -r で使える requrements.txt の形式で出力する。
  • list は、 --format オプションを使って legacy columns freeze json などさまざまなフォーマットで出力できる。
  • freeze は、デフォルトでは pipsetuptools は含まない。一方の listpipsetuptools も含む(厳密にいうと、 list は editable モードでインストールされたパッケージも含む、という違いもあるようです)。

私の素人的なざっくりした印象では、 freeze は requirements.txt ファイル生成専用のもので、 list はその他いろんな用途のための(人間に見せたり pip 以外のプログラムに渡したりするための)一覧を生成するもの、というイメージです。

後者の「個別に確認する方法」は、 pip コマンドのサブコマンド show を使うというものです。 pip show [パッケージ名] と入力します。

Requests ライブラリで試してみると、私の環境では次のように表示されました。

$ pip show requests
Name: requests
Version: 2.18.4
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /[Python がインストールされているパス]/lib/python3.6/site-packages
Requires: idna, chardet, urllib3, certifi

コード内で確認する

続いて、 Python ライブラリのバージョンをコード内で確認する方法についてです。

私はこれをする必要に迫られたことがないのでこの方法がよいかとどうかの確信は無いのですが、おそらく pkg_resources.working_set に格納されているパッケージ情報を見る方法がよいのではないかと思います。

import pkg_resources

def get_package_versions(name_fragment):
    '''指定された文字列を名前に含むパッケージのバージョン情報を取得する

    Args:
        name_fragment (str): 情報を確認したいパッケージに含まれる文字列。

    Returns:
        list: 'name' と 'version' というキーを持った辞書のリスト。
    '''
    return [
        {
            'name': package.project_name,
            'version': package.version,
        }
        for package in pkg_resources.working_set
        if name_fragment in package.project_name
    ]

get_package_versions('req')
# => [{'name': 'requests', 'version': '2.18.4'}]

get_package_versions('jupyter')
# => [{'name': 'jupyter', 'version': '1.0.0'},
#  {'name': 'jupyter-core', 'version': '4.0.6'},
#  {'name': 'jupyter-console', 'version': '4.1.1'},
#  {'name': 'jupyter-client', 'version': '4.1.1'}]

詳細を知りたい方は setuptools の公式ドキュメントの pkg_resources のところをご覧ください


ライブラリのバージョンを調べる別の方法として、「モジュールオブジェクトの __version__ アトリビュートを見る」というのがありますが、ライブラリの作者が入れていなければこのアトリビュートは無いこともあるようなので、あまりここに依存すべきではないのかと思います。

Python で本体やライブラリのバージョンを確認する方法については以上です。


参考

0 件のコメント: