[Python] パッケージの依存関係を調べる

Pythonで開発をしていると何かとお世話になるパッケージ達

pipコマンドで簡単にインストールできるだけあって何かといっぱい入れてしまいがち

しかし、pipだけではこれらの依存関係を調べることが面倒なので、パッケージの依存関係を簡単に調べることはできないものかと少し探してみたのでそれのメモ。

pipdeptree

調べてみたところpipdeptreeをというパッケージを利用すると依存関係をコンソールに表示してくれるようになるらしい。
なので早速インストール

$ pip install pipdeptree

インストールが完了するとpipdeptreeコマンドが使えるようになるので実行してみる

$ pipdeptree
django-debug-toolbar==1.11
  - Django [required: >=1.11, installed: 2.1.5]
    - pytz [required: Any, installed: 2018.9]
  - sqlparse [required: >=0.2.0, installed: 0.2.4]
django-extensions==2.1.5
  - six [required: >=1.2, installed: 1.12.0]
pipdeptree==0.13.2
  - pip [required: >=6.0.0, installed: 19.0.1]
pylint==2.2.2
  - astroid [required: >=2.0.0, installed: 2.1.0]
    - lazy-object-proxy [required: Any, installed: 1.3.1]
    - six [required: Any, installed: 1.12.0]
    - wrapt [required: Any, installed: 1.10.11]
  - isort [required: >=4.2.5, installed: 4.3.4]
  - mccabe [required: Any, installed: 0.6.1]
setuptools==39.0.1
Werkzeug==0.14.1

こんな感じで依存関係を表示してくれる。
要求するバージョンと今入っているバージョンの両方を表示してくれる親切設計。

因みに、似たような名前のパッケージにpiptreeというのがあるのだがこれはどうも二系向けっぽいので間違えてインストールしても三系では使えなかった。

環境を二系に切り替えて使ってみたところpipdeptreeの二系向けのような動作を確認できた。
ただし、若干使いづらい。

インストール

$ pip install piptree

この辺はほぼ同じ

依存関係を調べる

コマンド実行時に引数にインストール済みのパッケージのリストを記述したファイルが必要なので事前に書き出しておく

$ pip freeze > requirements.txt

それからやっと

$ piptree requirements.txt

を実行

バージョン衝突検出

なんと、パッケージ間で依存するバージョンが違った時に衝突の検出まで行ってくれる模様。

なので、少し意地悪してpylint==2.2.2で必要としているisortのバージョンを下げてみよう。

$ pip install -U "isort< 4.2.5"

その状態で改めてpipdeptreeコマンドを実行!

Warning!!! Possibly conflicting dependencies found:
* pylint==2.2.2
 - isort [required: >=4.2.5, installed: 4.2.4]
------------------------------------------------------------------------
django-debug-toolbar==1.11
  - Django [required: >=1.11, installed: 2.1.5]
    - pytz [required: Any, installed: 2018.9]
  - sqlparse [required: >=0.2.0, installed: 0.2.4]
django-extensions==2.1.5
  - six [required: >=1.2, installed: 1.12.0]
pipdeptree==0.13.2
  - pip [required: >=6.0.0, installed: 19.0.1]
pylint==2.2.2
  - astroid [required: >=2.0.0, installed: 2.1.0]
    - lazy-object-proxy [required: Any, installed: 1.3.1]
    - six [required: Any, installed: 1.12.0]
    - wrapt [required: Any, installed: 1.10.11]
  - isort [required: >=4.2.5, installed: 4.2.4]
  - mccabe [required: Any, installed: 0.6.1]
setuptools==39.0.1
Werkzeug==0.14.1

おお、ちゃんと教えてくれる!
しかもわかりやすい。

まとめ

  • pipdeptreeでパッケージ間の依存関係を表示できる
  • バージョン衝突の検出もしてくれる

これで、安心してパッケージをインストールしまくれます。

追記

依存関係を丸ごとアンインストールしたい場合は、pip-autoremoveを使うと便利かもしれません。

[Python] 依存関係にあるパッケージを丸ごと削除する(pip-autoremove)