pyenv 与 conda 双轨制:管理 Python 版本和环境

2024-01-17
修改于 2024-02-22

Python 的版本与环境管理可以说是世界上最复杂的事情之一,让多个版本的 Python 和各种 conda 版本共存于同一台计算机实在一个难题。我的解决方案是用 pyenv 管理普通 Python 的版本;同时使用 Anaconda,但是只有用到它时再 activate。

如果你是一个开发者并且使用 Unix-like 的操作系统,那么通常存在 3 种不同类型的 Python:

  1. 系统 Python。一般在 /usr/bin 里。
  2. 安装的其他版本 Python。比如用包管理器指定版本安装的 Python,或者 pyenv 安装的版本。
  3. conda 使用的 Python。

/usr/bin/python3 一般是系统的基础设施,乱动可能导致整个系统炸掉。如果尝试用系统 pip 安装全局包,会有警告。由于版本固定,一般项目开发不会用这个 Python。

而在 macOS 上,由于没有第一方的包管理器,情况更加复杂:Homebrew 安装的 Python 从某些程度上也可以算是“系统 Python”了,因为它是很多其他 Homebrew 包的依赖,不能瞎搞。

我的需求是平时写一些 Python 小项目,同时还需要用 Python 做机器学习。对于机器学习项目来说,几乎是必须使用 conda 来管理 Python 包了,因为很多时候大家都用 conda,而且 conda 可以的让多个类似的项目共用一个虚拟环境,对于动辄几个 G 的机器学习依赖来说十分必要;但是对于普通 Python 项目来说,更多的还是用 pip 在 virtualenv 中安装依赖,这样就没有必要使用 conda 了。

目标行为

新 shell-session 的 python 由 pyenv 接管,通过 source activate base 进入 base(或者其他)conda 环境,此时 python 为 conda 的版本。再 conda deactivate 退出 conda 环境,此时 python 重新变为 pyenv 设置的版本。

image

安装 pyenv

首先,完整阅读 pyenv/pyenv - GitHub README.md 中的 “How it works” 段,了解 pyenv 的工作方式;然后按照 “Installation” 和 “Usage” 中的方法设置好 pyenv。

注:
如果使用 Homebrew 安装了 pyenv,那么实际上不需要在 ~/.zshrc 或类似的文件中添加 export PATH="$PYENV_ROOT/bin:$PATH" 这个 PATH,因为它的唯一目的是让下一行的 pyenv init - 可以找到 pyenv 脚本文件(除非你不打算将 pyenv 安装为 shell 函数),但是实际上 Homebrew 在安装时就已经做好了符号链接。(另外,由于通过 Homebrew 安装的版本实际上不存在这个 bin 目录,而且在添加 PATH 前都有验证,所以实际上即使完全按文档操作,这个 PATH 也不会真的背添加进去)

同时,pyenv 的 init 脚本会永远保证在它 eval 结束时,~/.pyenv/shims 在 PATH 中是唯一且处于最前边的。可能在 debug 时需要注意到这一点。

安装 Anaconda

可能有不少人觉得它臃肿,或者有些过于“中心化”了,但是作为用的人最多的 conda 版本,方便省心才是最主要的。

# 安装 anaconda
brew install anaconda

请查看 Conda 对你的 shell 做了什么? 这篇文章,最后介绍了如何为 shell 配置好 Conda。

除了那些通用的操作,本文的环境配置还需要关闭自动激活 base 环境 conda config --set auto_activate_base false,这样每次打开终端默认的都是 pyenv 提供的 Python,而非 conda 的 base 环境了。

Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.1.3