在 Ubuntu 云主机上通过 pyenv 管理 Python 多版本,是目前开发者(尤其是做数据科学、后端开发或微服务部署时)最主流且稳妥的方案之一。它不需要 root 权限,不污染系统自带的 Python 环境,且切换灵活。
下面是一份基于实战经验的完整指南,去掉了废话,直接上干货和避坑点。
1. 前置准备:安装编译依赖
pyenv 的核心原理是从源码编译 Python。Ubuntu 默认环境下缺少很多编译头文件,如果不提前装好,后续执行 pyenv install 时会报各种奇怪的错(比如找不到 OpenSSL 或 Zlib)。
强烈建议先更新源并安装构建工具:
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git
注:不同版本的 Ubuntu 包名可能微调,如果报错,根据错误提示补充缺失的 -dev 包即可。
2. 安装 pyenv
推荐使用官方推荐的安装脚本,它会自动处理环境变量配置。
curl https://pyenv.run | bash
执行完后,你需要将以下配置追加到你的 shell 配置文件(通常是 ~/.bashrc 或 ~/.zshrc,取决于你用的 shell)中:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
关键一步: 修改完配置文件后,必须执行 source ~/.bashrc(或对应文件),或者重新登录 SSH,让配置生效。你可以输入 pyenv versions 测试是否安装成功,如果输出了当前可用的版本列表(通常只有 system),说明安装成功。
3. 安装目标 Python 版本
假设你想安装 Python 3.9.7 和 3.10.4:
pyenv install 3.9.7
pyenv install 3.10.4
这一步比较耗时,因为涉及源码编译。如果遇到网络问题导致下载慢,可以设置XX或者手动下载源码包放到 ~/.pyenv/cache/ 目录下重试。
安装完成后,再次运行 pyenv versions,你应该能看到类似这样的输出:
system
* 3.9.7 (set by /root/.pyenv/version)
3.10.4
4. 版本切换策略
pyenv 提供了三个层级的版本控制,优先级从高到低:
- Shell 级别 (
pyenv shell <version>): 仅对当前终端会话有效。 - 目录级别 (
pyenv local <version>): 在当前目录及其子目录下有效。这是最常用的方式,配合项目使用。 - 全局级别 (
pyenv global <version>): 系统默认版本。
场景演示:
-
临时切换调试:
pyenv shell 3.10.4 python --version # 输出 3.10.4 -
为特定项目指定版本(推荐):
进入你的项目目录:cd /path/to/your/project pyenv local 3.9.7这会在当前目录生成一个
.python-version文件。当你cd进这个目录时,pyenv会自动切换;离开目录则恢复默认。 -
设置全局默认版本:
pyenv global 3.9.7
5. 进阶技巧:结合 Virtualenv 使用
单纯切换 Python 版本还不够,生产环境中通常需要隔离依赖。pyenv 内置了 virtualenv 插件支持。
创建虚拟环境:
# 语法:pyenv virtualenv <python_version> <env_name>
pyenv virtualenv 3.9.7 my_project_env
激活虚拟环境:
pyenv activate my_project_env
退出虚拟环境:
pyenv deactivate
查看已创建的虚拟环境:
pyenv virtualenvs
6. 常见坑与排查(Troubleshooting)
作为云主机用户,你可能会遇到以下问题,这里直接给出解决方案:
-
SSL 错误:
如果在pyenv install过程中报错Could not build the ssl module!,通常是因为系统层面的 OpenSSL 版本过旧或路径不对。- 解决: 确保第一步中的
libssl-dev已安装。如果是 Ubuntu 20.04+,有时还需要安装libssl1.1(新版可能是libssl3,需注意兼容性问题,建议优先升级系统库)。
- 解决: 确保第一步中的
-
pip 安装缓慢或失败:
国内云服务器连接 PyPI 源慢是常态。- 解决: 不要改全局 pip 配置,建议在项目中使用
requirements.txt时指定清华源或阿里源,或者在虚拟环境中临时使用:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
- 解决: 不要改全局 pip 配置,建议在项目中使用
-
命令找不到 (
command not found: pyenv):
90% 的情况是环境变量没生效。- 解决: 检查
~/.bashrc末尾是否有eval "$(pyenv init -)"。如果没有,加上并source。注意,有些教程只写了init --path,这在某些 shell 环境下会导致命令补全失效,建议保留完整的初始化语句。
- 解决: 检查
-
卸载某个版本:
pyenv uninstall 3.9.7这会删除源码编译后的二进制文件和缓存,释放磁盘空间。
总结
在 Ubuntu 云主机上使用 pyenv,核心逻辑就是:装依赖 -> 装 pyenv -> 装 Python -> 用 local 或 virtualenv 隔离环境。
这种方式比直接用 apt install python3.x 更干净,也比 Docker 轻量(对于简单的脚本或中小型应用而言)。只要处理好编译依赖,整个过程非常稳定。记得定期清理 ~/.pyenv/cache 下的源码压缩包以节省云主机的 EBS 存储成本。
云技术博客