できない.dev

pip install が Permission denied で失敗する

システム Python のサイトパッケージは root 所有のため、ユーザ権限の pip install は書き込みに失敗する。
venv を作るのが正攻法で、--user オプションや pipx も選択肢。
sudo pip は環境破壊につながるため避ける。

公開: 更新:

要約

pip installPermission denied または error: externally-managed-environment で失敗するのは、システム Python の site-packages に書こうとしているから仮想環境 (venv) を作って activate してから install するのが正攻法。sudo pip は OS の Python を壊すリスクがあるため使わない。

よくある原因

  1. システム Python に書き込もうとする: /usr/lib/python3.x/site-packages などは root 所有で一般ユーザに書き込み権が無い
  2. venv を作らず開発: プロジェクトごとに環境を切らず、global を直接汚そうとしている
  3. activate 忘れ: .venv は作ってあるが、シェルを開き直して activate していない
  4. PEP 668 のガード: Python 3.11 以降の Debian / Ubuntu 等では、システム環境への install は明示的に拒否される

解決策

1. venv を使う(推奨)

python3 -m venv .venv
source .venv/bin/activate   # Windows は .venv\Scripts\activate
pip install -r requirements.txt

pip 公式ユーザガイド(新しいタブで開く) でも、プロジェクト単位の venv が推奨。which pip で venv 内の pip を指しているか確認する。

2. CLI ツールには pipx

python3 -m pip install --user pipx
pipx install black
pipx install poetry

pipx は各ツールごとに独立 venv を作って公開コマンドだけシンボリックリンクする。
グローバル環境を汚さず、pipx upgrade で個別更新できる。

3. --user オプション

pip install --user requests

~/.local/lib/python3.x/site-packages に入る。
venv が使えない CI や、システム全体ではなく自分だけ使いたい場合に有効。
ただし複数プロジェクトの依存衝突は防げないので、開発用途には venv の方が無難。

4. sudo pip install は使わない

# NG: OS パッケージマネージャと喧嘩する
sudo pip install requests

PEP 668(新しいタブで開く) で標準化された通り、ディストリ提供の Python は OS 側で管理されている。
ここに pip で上書きすると、apt で入れた他パッケージが壊れる。

実行例

実際に上記の手順を python:3.12(Debian GNU/Linux 13)で、pip の自動 --user フォールバックを止めた状態で走らせると、venv なしの pip install wrapt/usr/local/lib/python3.12/site-packages への書き込みで Permission denied(終了コード 1)となり、venv を作成・activate した後の同コマンドでは正常にインストールが完了する。

検証環境のバージョンは実行ログの冒頭に次のとおり記録されている。

PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
Python 3.12.13

なお、pip は site-packages に書き込めないとき自動で --user インストールへ切り替えるため、再現時はこのフォールバックを止める PYTHONNOUSERSITE=1 を付け、あわせて --no-cache-dir も指定して実行している。
この指定が無い場合は Defaulting to user installation because normal site-packages is not writeable と表示され、~/.local へのインストールとして成功する。

$ pip install wrapt
Collecting wrapt
  Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (7.4 kB)
Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (172 kB)
Installing collected packages: wrapt
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: '/usr/local/lib/python3.12/site-packages/wrapt'
Consider using the `--user` option or check the permissions.
 
[notice] A new release of pip is available: 25.0.1 -> 26.2.1
[notice] To update, run: pip install --upgrade pip
pip の終了コード: 1

なお、この環境では PEP 668 の error: externally-managed-environment は発生せず、site-packages への書き込み権限エラーとして再現した。
公式 python イメージは /usr/local 配下に独自ビルドの Python を配置しており EXTERNALLY-MANAGED マーカーを持たないため、ディストリビューション提供の Python とはエラーの出方が変わる。

$ ls -ld /usr/local/lib/python3.12/site-packages
drwxr-xr-x 4 root root 4096 Aug  5 03:54 /usr/local/lib/python3.12/site-packages
$ python3 -m venv .venv
$ source .venv/bin/activate
$ which pip
/home/appuser/.venv/bin/pip
$ pip install wrapt
Collecting wrapt
  Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (7.4 kB)
Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (172 kB)
Installing collected packages: wrapt
Successfully installed wrapt-2.3.0
 
[notice] A new release of pip is available: 25.0.1 -> 26.2.1
[notice] To update, run: pip install --upgrade pip
pip の終了コード: 0(0 なら解消)
$ python -c "import wrapt; print(wrapt.__version__)"
2.3.0

— 2026-08-08 時点の出力

この記事は役立ちましたか?