お伝えしたいこと
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
を封印すべき理由について書きました。