CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: pipdeptree でパッケージの依存関係を調べる

Python のパッケージ同士が、どのように依存しているかを調べるのは意外と面倒くさい。 そんなときは今回紹介する pipdeptree を使うと楽ができそう。

使った環境は次の通り。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.5
BuildVersion:   15F34
$ python --version
Python 3.5.1

下準備

まずは pip を使って pipdeptree をインストールしておく。

$ pip install pipdeptree

使ってみる

インストールすると pipdeptree コマンドが使えるようになる。 このコマンドを使うと、今の Python 実行環境にインストールされているパッケージの依存関係が得られる。

$ pipdeptree
wheel==0.29.0

今回は virtualenv を使って仮想環境を作った直後にインストールしている。 先ほど wheel しか表示されなかったのはそのため。

$ pip list
pip (8.1.2)
pipdeptree (0.6.0)
setuptools (21.2.1)
wheel (0.29.0)

次に、依存パッケージがそれなりに多いものとして、試しに Flask をインストールしてみよう。

$ pip install Flask

もう一度 pipdeptree を実行すると、インストールした Flask の依存関係が表示される。

$ pipdeptree
Flask==0.10.1
  - itsdangerous [required: >=0.21, installed: 0.24]
  - Jinja2 [required: >=2.4, installed: 2.8]
    - MarkupSafe [installed: 0.23]
  - Werkzeug [required: >=0.7, installed: 0.11.9]
wheel==0.29.0

要求するバージョンとインストールされているバージョンが表示されるのが親切だね。

バージョンの衝突を検出する

Python を扱っていて、たまに悩ましいのがパッケージが使っているバージョンがそれぞれ違ったりするところ。 pipdeptree では、それらの衝突も検出できる。

例えば Flask はテンプレートエンジンとして Jinja2 を依存パッケージとしている。 そして Flask のバージョンが 0.10.1 であれば Jinja2 はバージョン 2.4 以上が必要だ。 そこで、試しに Jinja2 のバージョンを 2.4 未満にダウングレードさせてみよう。

$ pip install -U "Jinja2<2.4"

この状況で改めて pipdeptree を実行してみる。 すると、バージョンがコンフリクトしていることが警告として得られた。

$ pipdeptree
Warning!!! Possibly conflicting dependencies found:
* Flask==0.10.1
 - Jinja2 [required: >=2.4, installed: 2.3.1]
------------------------------------------------------------------------
Flask==0.10.1
  - itsdangerous [required: >=0.21, installed: 0.24]
  - Jinja2 [required: >=2.4, installed: 2.3.1]
  - Werkzeug [required: >=0.7, installed: 0.11.9]
wheel==0.29.0

まとめ

  • pipdeptree を使うとパッケージの依存関係がわかる
  • さらに、依存しているパッケージのバージョンがコンフリクトしていないかもチェックできる