とある特殊な環境でPythonを書いていて、いくつかのライブラリがimportに失敗するという事態に遭遇しました。自分のローカルPC上であれば、pip freeze とかしてライブラリのバージョンを調べて原因を調査するのですが、その環境ではOSコマンドが打てず、同様の調査が不可能でした。importさえできれば {ライブラリ名}.__version__ みたいなプロパティから取得することもできたのですがimport自体が失敗するとあって調査に苦戦していました。
ところがどうやらimportを行わずにライブラリのメタデータにアクセスする方法がちゃんとあるようだったのでこの記事にまとめておきます。(正直、普通の環境であればpipで調べれれば済む話なので、ほとんどの人にとっては不要な知識だと思います。)
pkg_resources を使う方法
importせずにライブラリのバージョンを取得する方法の1個目は pkg_resources を使うものです。
次の例は、 arviz というライブラリのバージョンを調べたものです。
from pkg_resources import get_distribution
try:
version = get_distribution("arviz").version
print(f"version: {version}")
except pkg_resources.DistributionNotFound:
print("ライブラリが見つかりません")
# version: 0.16.1
僕は上記の方法で一旦解決しました。
ただ、これはsetuptoolsに依存したライブラリなのですが、その公式ドキュメントを見ると、もう廃止されたからimportlib.metadataを使えと書いてあるのですよね。
ということで合わせてそちらを紹介します。
importlib を使う方法
importlib はPython3.8から標準ライブラリに含まれたライブラリです。
これはインストール済みのライブラリのメタデータにアクセスする機能を持っています。標準ライブラリになったわけなので、最近のPythonであればおそらくこちらを使うのが適切なんだと思います。
参考: importlib.metadata — パッケージメタデータへのアクセス — Python 3.13.0 ドキュメント
サンプルコードでもバージョンを取得していますね。それにならってやってみましょう。
import importlib.metadata
try:
version = importlib.metadata.version("arviz")
print(f"version: {version}")
except importlib.metadata.PackageNotFoundError:
print("ライブラリが見つかりません")
# version: 0.16.1
同じような結果が得られました。
余談ですが、公式ドキュメントのサンプルコードでは、
from importlib.metadata import version
として versionという関数をインポートしています。僕も最初それに倣ってやったのですが、versionを結果の変数名で使いたいな、と思ったので上記のインポート方法にしました。
ただ、これはこれでイマイチな気もします。