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_info
は major ```` 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_info
と sys.version
の使い分けですが、プログラムでバージョン情報を利用したい場合(メジャーバージョンによって分岐させたい場合など)には sys.version_info
を、単純に人が確認するのに使いたい場合には sys.version
の方を使うとよいかと思います。
ライブラリのバージョンを確認する
続いて、 Python 本体ではなくライブラリのバージョンを確認する方法についてです。
ターミナルで確認する
ターミナルでライブラリのバージョンを確認する方法としては、 Python 3 で 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"}, ...
freeze
と list
はよく似ていますが、両者にはおおよそ次のような違いがあります。
freeze
は、pip install -r
で使える requrements.txt の形式で出力する。list
は、--format
オプションを使ってlegacy ```` columns ```` freeze ```` json
などさまざまなフォーマットで出力できる。freeze
は、デフォルトではpip
やsetuptools
は含まない。一方のlist
はpip
やsetuptools
も含む(厳密にいうと、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: https://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 で本体やライブラリのバージョンを確認する方法については以上です。
参考