pip install が Permission denied で失敗する
システム Python のサイトパッケージは root 所有のため、ユーザ権限の pip install は書き込みに失敗する。
venv を作るのが正攻法で、--user オプションや pipx も選択肢。
sudo pip は環境破壊につながるため避ける。
公開: 更新:
要約
pip install が Permission denied または error: externally-managed-environment で失敗するのは、システム Python の site-packages に書こうとしているから。仮想環境 (venv) を作って activate してから install するのが正攻法。sudo pip は OS の Python を壊すリスクがあるため使わない。
よくある原因
- システム Python に書き込もうとする:
/usr/lib/python3.x/site-packagesなどは root 所有で一般ユーザに書き込み権が無い - venv を作らず開発: プロジェクトごとに環境を切らず、global を直接汚そうとしている
- activate 忘れ:
.venvは作ってあるが、シェルを開き直して activate していない - 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.txtpip 公式ユーザガイド(新しいタブで開く) でも、プロジェクト単位の venv が推奨。which pip で venv 内の pip を指しているか確認する。
2. CLI ツールには pipx
python3 -m pip install --user pipx
pipx install black
pipx install poetrypipx は各ツールごとに独立 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 requestsPEP 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 時点の出力