1. 为什么需要多版本Python环境如果你是一名Python开发者尤其是需要同时维护新旧项目的开发者一定遇到过这样的困扰某个老项目还在用Python 2.7而新项目已经迁移到Python 3.12。macOS系统自带的Python版本有限直接修改系统Python又可能引发各种兼容性问题。这时候pyenv就是你的救星。pyenv是一个轻量级的Python版本管理工具它可以让你在同一台机器上安装多个Python版本并且在不同项目间无缝切换。想象一下这就像给你的电脑装了一个Python版本开关需要哪个版本就切换到哪个版本完全不会互相干扰。我在维护一个老旧的Django 1.5项目时就深有体会。这个项目只能在Python 2.7下运行而我的新项目又需要使用Python 3.12的最新特性。pyenv完美解决了这个问题让我可以在两个项目间自如切换再也不用担心版本冲突了。2. 准备工作安装Homebrew和必要依赖在安装pyenv之前我们需要先准备好macOS的开发环境。Homebrew是macOS上最受欢迎的包管理工具可以说是mac开发者的必备神器。打开终端执行以下命令安装Homebrew/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)安装完成后建议运行以下命令确保Homebrew是最新版本brew update brew doctor接下来我们需要安装一些编译Python时可能需要的依赖库。特别是对于Python 2.7这样的老版本缺少这些依赖会导致安装失败brew install openssl readline sqlite3 xz zlib我曾经在安装Python 2.7时遇到过zlib not available的错误就是因为缺少这些依赖库。安装完这些依赖后后续的Python安装就会顺利很多。3. 安装和配置pyenv有了Homebrew安装pyenv就非常简单了brew install pyenv安装完成后我们需要配置shell环境让pyenv能够正常工作。根据你使用的shellbash或zsh修改对应的配置文件对于bash用户通常是~/.bash_profileecho export PYENV_ROOT$HOME/.pyenv ~/.bash_profile echo export PATH$PYENV_ROOT/bin:$PATH ~/.bash_profile echo eval $(pyenv init --path) ~/.bash_profile echo eval $(pyenv init -) ~/.bash_profile对于zsh用户通常是~/.zshrcecho export PYENV_ROOT$HOME/.pyenv ~/.zshrc echo export PATH$PYENV_ROOT/bin:$PATH ~/.zshrc echo eval $(pyenv init --path) ~/.zshrc echo eval $(pyenv init -) ~/.zshrc配置完成后重启终端或者执行以下命令使配置生效exec $SHELL现在你可以验证pyenv是否安装成功pyenv --version如果看到版本号输出如pyenv 2.3.10说明安装成功。4. 安装Python 2.7和3.12pyenv的强大之处在于它可以安装几乎所有的Python版本。我们先来看看有哪些版本可用pyenv install --list这个命令会列出所有可安装的Python版本从古老的2.1.3到最新的3.12.x应有尽有。4.1 安装Python 2.7.18虽然Python 2已经停止维护但很多老项目仍然依赖它。我们安装官方维护的最后一个Python 2版本2.7.18pyenv install 2.7.18安装过程可能需要几分钟时间取决于你的网络速度和机器性能。如果遇到编译错误很可能是缺少某些依赖库可以回头检查第2步的依赖是否都安装好了。4.2 安装Python 3.12.x接下来安装最新的Python 3.12版本pyenv install 3.12.0pyenv会自动下载源代码并编译安装。安装完成后你可以查看已安装的所有Python版本pyenv versions输出应该类似于* system (set by /Users/yourname/.pyenv/version) 2.7.18 3.12.0这里的system表示macOS系统自带的Python版本。5. 管理和切换Python版本安装完多个Python版本后pyenv提供了几种方式来管理它们5.1 全局版本设置全局设置会影响整个系统的Python版本在当前用户下pyenv global 3.12.0执行后任何地方运行python命令都会使用Python 3.12.0。验证一下python --version5.2 局部版本设置局部设置只对特定目录及其子目录有效非常适合项目特定的Python版本需求mkdir my_python2_project cd my_python2_project pyenv local 2.7.18这会在当前目录创建一个.python-version文件记录使用的Python版本。以后进入这个目录时pyenv会自动切换到指定的Python版本。5.3 临时版本设置如果只想在当前shell会话中使用特定版本可以使用pyenv shell 3.12.0这个设置只对当前终端窗口有效关闭后就会恢复原来的设置。5.4 版本优先级pyenv的版本切换遵循以下优先级规则shell设置最高优先级局部设置项目目录全局设置系统Python最低优先级这意味着你可以在不同层级灵活控制Python版本而不会互相干扰。6. 解决常见问题在使用pyenv的过程中可能会遇到一些常见问题这里分享几个我遇到过的坑和解决方案6.1 Python 2.7安装失败在较新的macOS系统上安装Python 2.7可能会遇到zlib缺失的问题。解决方法brew install zlib export LDFLAGS-L/usr/local/opt/zlib/lib export CPPFLAGS-I/usr/local/opt/zlib/include pyenv install 2.7.186.2 pip安装包时报SSL错误Python 2.7的SSL模块可能不兼容现代网站的安全协议可以这样解决python -m pip install --upgrade pip pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org package_name6.3 切换版本后命令找不到有时切换版本后某些命令如pip可能找不到这时需要运行pyenv rehash这个命令会重新生成所有已安装Python版本的shim垫片文件。7. 结合虚拟环境使用虽然pyenv可以管理多个Python版本但项目间的依赖隔离还需要借助虚拟环境。pyenv可以和virtualenv或venv完美配合7.1 创建虚拟环境对于Python 3.3版本python -m venv myenv source myenv/bin/activate对于Python 2.7和早期Python 3版本pip install virtualenv virtualenv myenv source myenv/bin/activate7.2 pyenv-virtualenv插件pyenv还有一个virtualenv插件可以更方便地管理虚拟环境brew install pyenv-virtualenv然后在shell配置文件中添加eval $(pyenv virtualenv-init -)使用示例pyenv virtualenv 3.12.0 myproject-3.12 pyenv activate myproject-3.12 pyenv deactivate8. 实际工作流示例让我们看一个完整的工作流示例假设你需要同时维护两个项目老项目Django 1.5 Python 2.7新项目Django 4.2 Python 3.128.1 设置老项目环境mkdir legacy_project cd legacy_project pyenv local 2.7.18 python -m pip install --upgrade pip pip install virtualenv virtualenv venv source venv/bin/activate pip install django1.58.2 设置新项目环境mkdir new_project cd new_project pyenv local 3.12.0 python -m venv venv source venv/bin/activate pip install django4.28.3 日常切换只需要进入项目目录pyenv会自动切换到正确的Python版本cd ~/legacy_project python --version # 显示2.7.18 cd ~/new_project python --version # 显示3.12.0这种工作流让我在维护多个项目时省去了很多麻烦再也不用担心版本冲突的问题了。