[Python] パッケージのバージョンを取得する方法

結論

パッケージfooのパージョンを取得したいときは、setuptoolsをインストールした後、以下のようにします。

from pkg_resources import get_distribution
version = get_distribution("foo").version

議論

setuptoolsでsetup.pyを記述するとき、以下のようにパッケージのバージョンをsetup関数にあたえます。

from setuptools import setup, find_packages

setup(name="foo", version="0.1", packages=find_packages("src"),
    package_dir={"": "src"}, scripts=["foo"])

一方、フロントエンドとなるスクリプトfooを使用する場合、

$ foo --version

のようにオプションを指定されたら、プログラムのバージョンを表示するようにしたいでしょう。このとき、fooスクリプトに表示するバージョン番号を再度記述するのは、二度手間になり、DRY (Don't Repeat Yourself) の原則に反します。

そこで、結論で示したコードを使って自分のパッケージのパージョンを取得するようにすれば、fooスクリプトにはバージョンを記述する必要はなくなります。例えば、バージョンを表示して終了する関数を、以下のように記述します。

def version():
    from pkg_resources import get_distribution
    name = "foo"
    version = get_distribution(name).version
    print "%(name)s %(version)s" % dict(name=name, version=version)
    sys.exit(0)