🐍

[備忘録]pipを実行時の「error: externally-managed-environment」の解決方法

2024/09/04に公開

クリーンなPC(WSL2)でpip3 install ... を実行したらerror: externally-managed-environmentエラーが発生したので、対処法の備忘録。

前提として、開発やツール、プログラムで使うようなライブラリをインストールするときは、venvを使用しています。今回はCLIアプリをWSL2のシステムにインストールしたい時の対処法です。

➜  ~ pip3 install ...
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.

    If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:

    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz

    If you wish to install a Python application that isn't in Homebrew,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. You can install pipx with

    brew install pipx

    You may restore the old behavior of pip by passing
    the '--break-system-packages' flag to pip, or by adding
    'break-system-packages = true' to your pip.conf file. The latter
    will permanently disable this error.

    If you disable this error, we STRONGLY recommend that you additionally
    pass the '--user' flag to pip, or set 'user = true' in your pip.conf
    file. Failure to do this can result in a broken Homebrew installation.

    Read more about this behavior here: <https://peps.python.org/pep-0668/>

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

システム全体にPythonパッケージをインストールするならHomebrew使ってね。それ以外は仮想環境を使用してね。というようなエラーメッセージ。
無視する方法(--break-system-packages)や無効にする方法も記載されているが、好まないので割愛。

HomebrewってMac用じゃない?って思ったけど、Linux向けでもある(The Missing Package Manager for macOS (or Linux))ので、Homebrewもインストールする。

インストール手順は公式サイトを見てください。

➜  ~ test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)"
➜  ~ test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
➜  ~ echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bashrc
➜  ~ echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.zshrc #zsh使ってる場合はこっちかな

最初のエラーに従いpipxを入れる

➜  ~ brew install pipx
(省略)
➜  ~ pipx --version
1.7.1

pipx ensurepathで環境変数設定を行う

➜  ~ pipx ensurepath
Success! Added /home/red/.local/bin to the PATH environment variable.

Consider adding shell completions for pipx. Run 'pipx completions' for instructions.

You will need to open a new terminal or re-login for the PATH changes to take effect. Alternatively, you can source
your shell's config file with e.g. 'source ~/.bashrc'.

Otherwise pipx is ready to go! ✨ 🌟 ✨

要再ログイン
自分はzshを使ってるけど、.zprofileを見たら、ちゃんと登録されていたので多分問題ないと思う。

➜  ~ cat .zprofile

# Created by `pipx` on 2024-09-04 01:29:03
export PATH="$PATH:/home/red/.local/bin"

後は pipx install ... でライブラリを追加することができる

余談

pipx ensurepathを実行した時に、pipxのシェル補完も追加検討してね。って言われてるので、せっかくなので入れる。

pipx completions を実行すると、各シェルごとの設定が出てくるので、その通りに行う。

➜  ~ autoload -U compinit && compinit
➜  ~ eval "$(register-python-argcomplete pipx)"
zsh: command not found: register-python-argcomplete #register-python-argcompleteが無いって言われる

➜  ~ pipx install argcomplete
  installed package argcomplete 3.5.0, installed using Python 3.12.5
  These apps are now globally available
    - activate-global-python-argcomplete
    - python-argcomplete-check-easy-install-script
    - register-python-argcomplete
done! ✨ 🌟 ✨
➜  ~ eval "$(register-python-argcomplete pipx)"
➜  ~ pipx --global # 補完が効くかテスト
--global            -- Perform action globally for all users.
--help          -h  -- show this help message and exit
--quiet         -q  -- Give less output. May be used multiple times corresponding to the ERROR and CRITICAL logging le
--verbose       -v  -- Give more output. May be used multiple times corresponding to the INFO, DEBUG and NOTSET loggin
--version           -- Print version and exit
completions         -- Print instructions on enabling shell completions for pipx
ensurepath          -- Ensure directories necessary for pipx operation are in your PATH environment variable.
environment         -- Print a list of environment variables and paths used by pipx.
inject              -- Install packages into an existing Virtual Environment
...

問題なくできた 😎

Discussion