[Python] 依存関係にあるパッケージを丸ごと削除する(pip-autoremove)
Pythonには便利なパッケージ管理ツールpip
が付属しています。
インストール時の依存関係の管理をやってくれてとっても素敵です。
しかし、アンインストール時にはその威力を発揮してくれません。
apt
のautoremove
の様に依存関係にあるパッケージを丸ごとアンインストールしれくれるツールは無いものかと探したところ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]
Sphinx
も Flask
も Jinja2
を要求しています。
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
は含まれていません。
賢いですね。
まさにapt
のautoremove
と同じように動作します。
pipの標準機能として取りこまれないかなぁ
さいごに
以上、pipでインストールしたパッケージを依存関係丸ごとアンインストールするツールの紹介でした。