Ubuntu中Python多版本如何共存
Ubuntu 下 Python 多版本共存的实用方案 在Ubuntu系统上管理多个Python版本,一直是让不少开发者头疼的事。特别是当你手头既有依赖Python 3.8的老项目,又想在Python 3.12上尝鲜新特性时,一个不小心,系统就乱了。其实,路子有不少,关键在于选对适合你场景的那个。 方
Ubuntu 下 Python 多版本共存的实用方案
在Ubuntu系统上管理多个Python版本,一直是让不少开发者头疼的事。特别是当你手头既有依赖Python 3.8的老项目,又想在Python 3.12上尝鲜新特性时,一个不小心,系统就乱了。其实,路子有不少,关键在于选对适合你场景的那个。

方案一:用 pyenv 精准管理多版本(强烈推荐)
要说最灵活、最不易出乱子的方案,还得是pyenv。它不会动系统自带的Python,而是在用户态通过修改环境变量来切换解释器版本,干净利落。
准备工作:安装编译依赖
动手之前,先确保系统装齐了编译Python所需的工具链。直接敲下面这条命令,把必要的依赖一网打尽:
sudo apt update && sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
安装 pyenv 本身
一条命令就能搞定:
curl https://pyenv.run | bash
装完之后,需要在 ~/.bashrc 末尾追加下面几行配置,然后让它生效:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
# 可选:集成虚拟环境插件
eval "$(pyenv virtualenv-init -)"
记得执行 source ~/.bashrc 刷新配置。
安装与切换版本
先用 pyenv install --list 看看有哪些版本可以装。挑一个你需要的,比如:
pyenv install 3.11.9
装好之后,怎么切换?pyenv提供了三级作用域:
- 全局:
pyenv global 3.11.9—— 整个系统默认用这个版本。 - 项目目录:
pyenv local 3.10.12—— 进入这个目录自动切换。 - 当前 shell:
pyenv shell 3.9.18—— 临时覆盖,退出终端就失效。
一切就绪后,用 python -V、which python、pyenv versions 查验是否生效。
实用提示
想查到底调用了哪个解释器的绝对路径,可以用 pyenv which python。更进阶的玩法是搭配 pyenv virtualenv 插件,为每个项目创建完全隔离的虚拟环境,从此告别包冲突的烦恼。
方案二:用 deadsnakes PPA 快速安装多版本
如果你不想自己编译源码,图省事,那 deadsnakes 这个第三方软件源就是现成的选择。
添加源并安装
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.12 python3.12-venv python3.12-dev
使用方式
安装后直接用带版本号的命令调用:python3.12 -V。想创建虚拟环境也很简单:
python3.12 -m venv .venv && source .venv/bin/activate
各版本以 python3.x 命令区分,互不干扰,适合不想费力编译的场景。
方案三:用 update-alternatives 切换系统默认 Python
这是一个系统级的方案,把多个Python版本纳入统一调度,再通过交互菜单选择一个作为默认的 python 命令。
注册备选版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 1
后面的数字是优先级,数字越大优先级越高。
交互式选择默认版本
执行 sudo update-alternatives --config python,输入序号即可切换。
验证与查看
sudo update-alternatives --list python
python -V
需要谨慎的地方
修改 /usr/bin/python 会影响整个系统,一些依赖Python 2.x的底层工具可能会因此罢工。生产环境不建议这么干,更推荐在用户态用 pyenv 或项目级 venv 来解决。
方案四:用 Docker 零侵入隔离版本
如果你追求完全不污染宿主机环境,或者是在做CI/CD、版本对比测试,Docker 是最好的方案。
快速启动不同版本的交互式容器:
docker run -it --rm python:3.8 bash
docker run -it --rm python:3.9 bash
零侵入、用完即走。需要持久化代码和依赖的话,挂载卷或编写 Dockerfile 即可。
最佳实践与常见问题
优先为每个项目创建隔离环境
无论是用自带的 venv 还是 pyenv 的虚拟环境,每个项目都应该有自己的“小天地”:
- 原生 venv:
python3.x -m venv .venv && source .venv/bin/activate - pyenv 虚拟环境:
pyenv virtualenv&& pyenv activate
正确安装与调用 pip
混用不同版本的 pip 是常见的坑。安全做法是明确指定解释器:
python3.12 -m pip install
如果提示找不到 pip,多半是没装对应版本的 -venv 包。装好之后再创建虚拟环境,用 python -m pip 就对了。
千万别替换系统 Python
系统自带的 Python 往往被很多底层工具依赖,随意覆盖 /usr/bin/python 极有可能搞崩系统。使用 python3.x 命令或用户态工具(如 pyenv)切换才是正解。
多用户或 CI 场景
这种情况优先上 pyenv 或 Docker。如果非要用 update-alternatives 做系统级默认,务必先在测试环境充分验证。
常见故障排查
- 编译失败:八成是缺了依赖包,回头对照方案一的依赖清单,补齐后重试。
- 命令找不到:检查
PATH和 shell 配置是否已加载。别忘了source ~/.bashrc。 - 包装到了错误环境:确认当前是否激活了正确的虚拟环境。用
python -m pip或python3.12 -m pip能从根本上避免混淆。


































