今天将自己开发测试使用的ubuntu server系统进行了升级,升级到最新的Ubuntu 24.04.3 LTS,结果运行Python代码安装一些依赖时出现了一些问题。
问题现象
写了一个脚本需要依赖flask、redis等一些依赖,所以我就运行pip3 install flask
安装依赖,结果遇到以下报错信息:
chengpei@ubuntu-cp:~$ pip install flask
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
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. Make
sure 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 a
virtual 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.
问题原因
查阅了相关资料了解到,是因为Python 3.12 在 Debian/Ubuntu 系统上的新机制(PEP 668),它阻止直接用 pip
在系统全局环境安装包,以免破坏系统自带的 Python 环境。
官方说明:https://peps.python.org/pep-0668
Ubuntu的python3.12是系统自带的,相关依赖是由系统包管理器(apt)管理的,而特定于 Python 的包管理工具(如 pip)来源并不一样,他们之间可能存在冲突,如果不加限制pip安装的依赖包可能会破坏系统自带环境。
解决方案
apt安装python依赖
既然系统包管理器(apt)可以管理python3相关依赖,那么我们可以直接使用apt安装我们需要的依赖,如我们想安装flask依赖可以运行以下脚本:
sudo apt update
sudo apt install python3-flask -y
这样我们就可以使用该依赖了,但是需要注意这个问题,apt 仓库里的 Flask 版本通常比较老(可能比 PyPI 落后几个大版本),如果只是学习或写 demo,可以用,但如果是新项目,不太推荐
pipx安装
如果你是要安装独立的 Python 应用(不是库,而是命令行工具),可以先安装pipx,然后用pipx安装你需要的应用 sudo apt install pipx -y
,但 Flask 是库,不是应用,所以我没用pipx
虚拟环境安装依赖
先创建一个虚拟环境,然后在虚拟环境里安装需要的依赖:
# 安装虚拟环境工具(如果还没有)
sudo apt install python3-venv -y
# 创建虚拟环境
python3 -m venv my_venv
# 激活虚拟环境
source my_venv/bin/activate
# 在虚拟环境里安装 Flask
pip install flask
创建虚拟环境时,会创建一个你指定的my_venv
文件夹,里面就是一个python3虚拟环境,激活虚拟环境后,再使用pip安装依赖时,所有的依赖会安装到虚拟环境文件夹的lib目录下,依赖统一管理比较推荐
总结
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
apt (系统包管理器) | 系统自带管理,稳定、安全 适合系统级 Python 脚本 安装速度快 |
版本老旧(落后 PyPI) 和 pip 管理可能冲突 依赖更新慢 |
系统服务、稳定性要求高的环境 |
pipx | 每个工具独立虚拟环境,互不干扰 安装后直接可用(自动加到 PATH) 升级/卸载方便 |
只适合单个 CLI 工具,不适合项目依赖 不适合复杂依赖管理 |
安装全局命令行工具(如 httpie 、black 、poetry 、ansible 等) |
虚拟环境 (venv + pip) | 完全隔离项目依赖,避免冲突 支持最新 PyPI 包 团队开发常用(配合 requirements.txt )灵活,可装任意组合 |
需要手动激活环境 略麻烦 |
开发应用/项目(如 Flask/Django/FastAPI 项目),团队协作环境 |
我这里采用虚拟环境 (venv + pip),所有依赖统一放在虚拟环境文件夹里,要删除也比较方便干净
评论区