努力
加油

Ubuntu云主机如何通过pyenv实现Python多版本切换?

在 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 提供了三个层级的版本控制,优先级从高到低:

  1. Shell 级别 (pyenv shell <version>): 仅对当前终端会话有效。
  2. 目录级别 (pyenv local <version>): 在当前目录及其子目录下有效。这是最常用的方式,配合项目使用。
  3. 全局级别 (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)

作为云主机用户,你可能会遇到以下问题,这里直接给出解决方案:

  1. SSL 错误:
    如果在 pyenv install 过程中报错 Could not build the ssl module!,通常是因为系统层面的 OpenSSL 版本过旧或路径不对。

    • 解决: 确保第一步中的 libssl-dev 已安装。如果是 Ubuntu 20.04+,有时还需要安装 libssl1.1(新版可能是 libssl3,需注意兼容性问题,建议优先升级系统库)。
  2. pip 安装缓慢或失败:
    国内云服务器连接 PyPI 源慢是常态。

    • 解决: 不要改全局 pip 配置,建议在项目中使用 requirements.txt 时指定清华源或阿里源,或者在虚拟环境中临时使用:
      pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  3. 命令找不到 (command not found: pyenv):
    90% 的情况是环境变量没生效。

    • 解决: 检查 ~/.bashrc 末尾是否有 eval "$(pyenv init -)"。如果没有,加上并 source。注意,有些教程只写了 init --path,这在某些 shell 环境下会导致命令补全失效,建议保留完整的初始化语句。
  4. 卸载某个版本:

    pyenv uninstall 3.9.7

    这会删除源码编译后的二进制文件和缓存,释放磁盘空间。

总结

在 Ubuntu 云主机上使用 pyenv,核心逻辑就是:装依赖 -> 装 pyenv -> 装 Python -> 用 local 或 virtualenv 隔离环境。

这种方式比直接用 apt install python3.x 更干净,也比 Docker 轻量(对于简单的脚本或中小型应用而言)。只要处理好编译依赖,整个过程非常稳定。记得定期清理 ~/.pyenv/cache 下的源码压缩包以节省云主机的 EBS 存储成本。