えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

sudo pip を実行してはいけない理由

python-logo

お伝えしたいこと

sudo pipを実行すべきではないという話を書きます。

詳しくは書きませんが、ローカルのVMsudo 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を封印すべき理由について書きました。

関連記事

endy-tech.hatenablog.jp