Python error externally-managed-environment
Lastmod: 2024-09-07

Bug报错详情

~ % python3 -m pip install pip 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 non-brew-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip.

If you wish to install a non-brew packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

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.

分析

macOS系统路径是自带Python 3.9的/usr/bin/python,然后pip的路径安装在以前一直相安无事。

% /usr/bin/python3 -m pip -V
pip 24.0 from /Users/jyufu/Library/Python/3.9/lib/python/site-packages/pip (python 3.9)

但由于Brew安装某些应用时强制指定了依赖PythonXX版本,所以brew自己又管理了一套Python版本。

% brew uses --installed python@3.12
ffmpeg          glib            harfbuzz        libass          pango           pipx            scrcpy          tesseract

然后,Brew自己在根目录的.zprofile添加一行了环境变量,

eval "$(/opt/homebrew/bin/brew shellenv)"

所以我的环境变量最前面是brew的路径,使用python3自然用了brew的python。

以前我用python -m pip install requests的命令来安装依赖库,应该算是系统层面(system-wide)的安装。如今的brew版python则认为这是不恰当、有风险的操作,可能搞坏系统依赖。

Marking an interpreter as using an external package manager

怎么办

不爽,brew把我的Python抢占了,然后还不能好好用。

回想,即合规范地用,它还是告诉了方法的。

If you wish to install a non-brew-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip.

自行再生成一个虚拟环境。然后把路径放在环境变量最前面。

/usr/bin/python3 -m venv ~/.local/python3/

echo "PATH=~/.local/python3/bin:\$PATH" >> ~/.zprofile