sudo pip を実行してはいけない理由
お伝えしたいこと
sudo pipを実行すべきではないという話を書きます。
詳しくは書きませんが、ローカルのVMでsudo pip uninstallを実行した結果、状況次第ではおかしなことになりました。
検証の結果、わかったことをかいつまんでお伝えします。
※元々別記事に書いてあった内容ですが、記事を分けました
sudo pip install が NG である理由
sudo pip installは実行しないでください。
Fedora Wikiでも、以下のように力強く書かれていました。
Never ever ever ever use pip or pip3 with sudo. Use pip --user or Python virtual environments instead.
Fedora Wiki
実行してはいけない理由は2つあります。
- システムを破壊する懸念がある
- 知らぬ間にvenvの外側を破壊するケースがある
詳細はこの後に続きます。
システムを破壊する懸念
pipには、--systemと--userの2種類があります。
pip install --systemは、システム全体にPythonパッケージをインストールするというオプションです。
デフォルトのインストール先は/usr/local/配下です。
具体的には/usr/local/bin/や、/usr/local/lib/pythonX.Y/site-packages/配下です。
pip install --userは、ユーザーごとに個別にPythonパッケージをインストールするという意味です。
デフォルトのインストール先は、~/.local配下です。
具体的には~/.local/bin/や、~/.local/lib/pythonX.Y/site-packages/配下です。
pip listを実行すると、実は--systemと--userの両方をマージした結果が出力されます。
pip list --userを実行すると、--userの結果のみが表示されます。
pip listの仕組みを正確に理解しているわけではありませんが、pipは恐らくPythonのライブラリ検索パス上にPythonパッケージ (※) が含まれる場合に表示される作りになっています。
(※) あるルールを満たすディレクトリのこと
例えば、sudo dnf install ansibleのようにpip以外の仕組みで導入された場合も、pip listで表示されます。
そして、sudo pip uninstall ansibleを実行することで関連ファイルを削除することができます。
もしこのような方法で削除すると、おかしなことになります。
dnf list ansibleでインストール済みと表示されますが、pip listにはansibleと表示されません。
そしてansibleのコマンド実行に失敗します。
ライブラリや実行ファイルなどが削除されているため、当然です。
このような状況になったら、sudo dnf reinstall ansibleなどで再インストールして復旧できますが、混乱の度合いは計り知れません。
※dnfとpipではインストール済みか否かを判断する基準が異なると思われます。dnfは「dnf removeを実行したか否か」で判断するのに対し、pipは「パッケージの実体がファイルとして存在するか」で判断しているように見えました
このように、sudo pipは影響が大きいです。
その上、他のインストール手段と競合しうる危険性をはらんでいます。
原則として、sudo pipは使うべきではないと思います。
sudoさえつけなければ、間違えてpip uninstall ansibleを実行しても、権限不足でシステムのファイル削除は失敗してくれます。
知らぬ間にvenvの外側を破壊するケースがある
sudoをつけるとPATHの再読込が発生することで、仮想環境の外に出てしまいます。
更に、管理者権限でpip installを実行すると、--userをつけたときのような~/.local/配下ではなく、/usr/local/配下にインストールしてしまいます。
仮想環境の中であっても、sudo pip installだけは実行しないようにお気をつけください。
このコマンドを実行したら警告が出力されることからも、公式でも非推奨の操作です。
もちろん、sudo pip uninstallも原則として避けてください。
間違えてsudo pip installしてしまったパッケージを消す時だけ使うこともあるかもしれませんが...。
まとめ
sudo pipを封印すべき理由について書きました。
