[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
を使うと便利かもしれません。