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

Pythonには便利なパッケージ管理ツールpipが付属しています。

インストール時の依存関係の管理をやってくれてとっても素敵です。

しかし、アンインストール時にはその威力を発揮してくれません。

aptautoremoveの様に依存関係にあるパッケージを丸ごとアンインストールしれくれるツールは無いものかと探したところpip-autoremoveなるパッケージを見つけたのでご紹介

pip-autoremove

インストール

pip で入ります。

pip install pip-autoremove

これからアンインストールしようというのに、新しくパッケージをインストールするのもなんだかなぁって感じではありますが…

依存関係丸ごとアンインストール

先ほどインストールが完了していれば、pip-autoremoveコマンドが使えるようになっているので利用してみます。

どうせなら依存パッケージの数が多い方が幸せを感じやすいと思うので、依存パッケージが多いライブラリをインストールして実験してみます。

pip install Sphinx

Sphinxの依存パッケージは以下の通りです。

Sphinx==2.2.1
  - alabaster [required: >=0.7,<0.8, installed: 0.7.12]
  - babel [required: >=1.3,!=2.0, installed: 2.7.0]
    - pytz [required: >=2015.7, installed: 2019.3]
  - docutils [required: >=0.12, installed: 0.15.2]
  - imagesize [required: Any, installed: 1.1.0]
  - Jinja2 [required: >=2.3, installed: 2.10.3]
    - MarkupSafe [required: >=0.23, installed: 1.1.1]
  - packaging [required: Any, installed: 19.2]
    - pyparsing [required: >=2.0.2, installed: 2.4.4]
    - six [required: Any, installed: 1.13.0]
  - Pygments [required: >=2.0, installed: 2.4.2]
  - requests [required: >=2.5.0, installed: 2.22.0]
    - certifi [required: >=2017.4.17, installed: 2019.9.11]
    - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
    - idna [required: >=2.5,<2.9, installed: 2.8]
    - urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.6]
  - setuptools [required: Any, installed: 41.2.0]
  - snowballstemmer [required: >=1.1, installed: 2.0.0]
  - sphinxcontrib-applehelp [required: Any, installed: 1.0.1]
  - sphinxcontrib-devhelp [required: Any, installed: 1.0.1]
  - sphinxcontrib-htmlhelp [required: Any, installed: 1.0.2]
  - sphinxcontrib-jsmath [required: Any, installed: 1.0.1]
  - sphinxcontrib-qthelp [required: Any, installed: 1.0.2]
  - sphinxcontrib-serializinghtml [required: Any, installed: 1.1.3]

たくさんありますね。

これらをまとめてアンインストールします。

pip-autoremove Sphinx
Sphinx 2.2.1 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    Jinja2 2.10.3 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        MarkupSafe 1.1.1 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-devhelp 1.0.1 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    docutils 0.15.2 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    snowballstemmer 2.0.0 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-qthelp 1.0.2 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    alabaster 0.7.12 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    packaging 19.2 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        six 1.13.0 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        pyparsing 2.4.4 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-jsmath 1.0.1 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    Babel 2.7.0 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        pytz 2019.3 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    Pygments 2.4.2 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    requests 2.22.0 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        certifi 2019.9.11 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        chardet 3.0.4 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        idna 2.8 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
        urllib3 1.25.6 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    imagesize 1.1.0 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-htmlhelp 1.0.2 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-applehelp 1.0.1 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    sphinxcontrib-serializinghtml 1.1.3 (/Users/user/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
Uninstall (y/N)?

こんな感じで依存パッケージ全てを消してもいいか確認してきます。

yとすると依存パッケージを全てアンインストールしてくれます。

Uninstalling sphinxcontrib-jsmath-1.0.1:
  Successfully uninstalled sphinxcontrib-jsmath-1.0.1
Uninstalling sphinxcontrib-serializinghtml-1.1.3:
  Successfully uninstalled sphinxcontrib-serializinghtml-1.1.3
Uninstalling pytz-2019.3:
  Successfully uninstalled pytz-2019.3
Uninstalling sphinxcontrib-applehelp-1.0.1:
  Successfully uninstalled sphinxcontrib-applehelp-1.0.1
Uninstalling sphinxcontrib-qthelp-1.0.2:
  Successfully uninstalled sphinxcontrib-qthelp-1.0.2
Uninstalling idna-2.8:
  Successfully uninstalled idna-2.8
Uninstalling MarkupSafe-1.1.1:
  Successfully uninstalled MarkupSafe-1.1.1
Uninstalling imagesize-1.1.0:
  Successfully uninstalled imagesize-1.1.0
Uninstalling snowballstemmer-2.0.0:
  Successfully uninstalled snowballstemmer-2.0.0
Uninstalling requests-2.22.0:
  Successfully uninstalled requests-2.22.0
Uninstalling Jinja2-2.10.3:
  Successfully uninstalled Jinja2-2.10.3
Uninstalling alabaster-0.7.12:
  Successfully uninstalled alabaster-0.7.12
Uninstalling certifi-2019.9.11:
  Successfully uninstalled certifi-2019.9.11
Uninstalling packaging-19.2:
  Successfully uninstalled packaging-19.2
Uninstalling chardet-3.0.4:
  Successfully uninstalled chardet-3.0.4
Uninstalling Babel-2.7.0:
  Successfully uninstalled Babel-2.7.0
Uninstalling Pygments-2.4.2:
  Successfully uninstalled Pygments-2.4.2
Uninstalling sphinxcontrib-devhelp-1.0.1:
  Successfully uninstalled sphinxcontrib-devhelp-1.0.1
Uninstalling sphinxcontrib-htmlhelp-1.0.2:
  Successfully uninstalled sphinxcontrib-htmlhelp-1.0.2
Uninstalling docutils-0.15.2:
  Successfully uninstalled docutils-0.15.2
Uninstalling Sphinx-2.2.1:
  Successfully uninstalled Sphinx-2.2.1
Uninstalling urllib3-1.25.6:
  Successfully uninstalled urllib3-1.25.6
Uninstalling six-1.13.0:
  Successfully uninstalled six-1.13.0
Uninstalling pyparsing-2.4.4:
  Successfully uninstalled pyparsing-2.4.4

では、複数のパッケージから要求されるパッケージが存在した場合はどんな挙動になるでしょうか?

気になるのでやってみましょう。

pip install Sphinx Flask

先ほどのSphinx に加え Flaskを追加しました。

Flaskの依存関係は以下の通りです。

Flask==1.1.1
  - click [required: >=5.1, installed: 7.0]
  - itsdangerous [required: >=0.24, installed: 1.1.0]
  - Jinja2 [required: >=2.10.1, installed: 2.10.3]
    - MarkupSafe [required: >=0.23, installed: 1.1.1]
  - Werkzeug [required: >=0.15, installed: 0.16.0]

SphinxFlaskJinja2 を要求しています。

Flask だけを消してみます。

pip-autoremove Flask
Flask 1.1.1 (/Users/tsunekawataiki/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    itsdangerous 1.1.0 (/Users/tsunekawataiki/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    Click 7.0 (/Users/tsunekawataiki/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
    Werkzeug 0.16.0 (/Users/tsunekawataiki/.pyenv/versions/3.7.1/envs/sample/lib/python3.7/site-packages)
Uninstall (y/N)?

Sphinxでも要求しているJinja2は含まれていません。
賢いですね。

まさにaptautoremoveと同じように動作します。

pipの標準機能として取りこまれないかなぁ

さいごに

以上、pipでインストールしたパッケージを依存関係丸ごとアンインストールするツールの紹介でした。