背景
在较新的 Linux 发行版中(实际上主要是 Ubuntu 23.04+ 开始严格执行 PEP 668 规范,但在 20.04 中如果你使用了更新的 Python PPA 也可能遇到),系统为了防止用户通过 pip 破坏系统自带的 Python 依赖,禁止了直接向系统环境安装包。现象如下:
error: externally-managed-environment× This environment is externally managed
╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.If you wish to install a non-Debian-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. Makesure you have python3-full installed.If you wish to install a non-Debian packaged Python application,it may be easiest to use pipx install xyz, which will manage avirtual environment for you. Make sure you have pipx installed.See /usr/share/doc/python3.12/README.venv for more information.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.
解决方案
01 暴力解决
修改:EXTERNALLY-MANAGED文件名字即可,注:python3.x这里的x对应自己系统的版本,然后就可以正常安装包了,但是官方既然出了这个机制,一定是这样使用有不保险的地方,所以建议第二种方案
sudo mv /usr/lib/python3.x/EXTERNALLY-MANAGED /usr/lib/python3.x/EXTERNALLY-MANAGED.bk
02 使用虚拟环境
利用 Ubuntu 20.04 默认可能不再绑定python这一特点,抢占 python 这个命令名。
我们不需要激活环境,只需要把命令“指”过去。推荐使用 Alias(别名) 方案,这是最安全、最容易回退的方式。
操作步骤
- 创建一个固定的虚拟环境
找个地方把环境藏起来,比如放在用户目录下的隐藏文件夹.daily_env。
# 确保安装了 venv 模块
sudo apt install python3-venv -y# 创建虚拟环境
python3 -m venv ~/.daily_env
- 修改
.bashrc设置别名
我们需要告诉系统:当我敲python时,实际上是在运行.daily_env里的那个python。
打开配置文件:
nano ~/.bashrc
在文件最末尾加入以下两行:# --- Python Daily Environment ---
# 拦截 python 和 pip 命令,指向虚拟环境
alias python='~/.daily_env/bin/python'
alias pip='~/.daily_env/bin/pip'
注意:不要 alias python3,让它继续指向系统。
保存退出(按 Ctrl+O 回车,然后 Ctrl+X)。
- 生效并验证
刷新配置:
source ~/.bashrc
现在来验证一下魔法是否生效:
检查 Python 位置:
which python
# 如果是 alias,这里可能不会显示路径,或者显示 alias python='...'
# 我们可以直接运行:
python -c "import sys; print(sys.executable)"
# 预期输出: /home/你的用户名/.daily_env/bin/python (成功!)
检查系统 Python3 位置(确保没坏):
python3 -c "import sys; print(sys.executable)"
# 预期输出: /usr/bin/python3 (系统环境,安全!)
这个方案的优点
无感使用:你以后安装包直接 pip install numpy,写代码直接 python main.py。不用打 source activate,也不用看终端前面那个烦人的 (venv) 前缀。
系统隔离:不管你怎么用 pip 装包,装出来的包都在 ~/.daily_env/lib/python3.8/site-packages 里,完全碰不到 /usr/lib/python3。
兼容性好:如果你偶尔需要用到系统的环境运行系统脚本(比如 apt 相关的),系统调用的都是 python3,完全不受你这个别名的影响。