pyenv 可以为每个项目指定独立的 Python 版本,使用它,我们可以在电脑上安装多个 Python 版本,然后,让项目 A 总是使用 Python 3.5,项目 B 总是使用 Python 3.9。

熟悉 ruby 的开发者们应该会联想到 rbenv。事实上,pyenv 就是 rbenv 的一个 fork。

rbenv 还有很多 fork:

  • swift: swiftenv
  • java: jenv

目录

1. 使用 pyenv

1.1. 安装 pyenv

  1. 使用 homebrew 安装 pyenv:

    $ brew install pyenv
    
  2. pyenv init- 加到 ~/.zshrc

这样,每次进入 shell 时,都可以初始化 pyenv。

   $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

1.2. 安装指定版本的 Python

$ pyenv install 3.8.0

1.3. 指定 Python 版本

为当前 shell session 指定 Python 版本

$ pyenv shell 3.8.0

为当前项目指定 Python 版本

在该项目的工作目录里:

$ pyenv local 3.8.0

为全局指定 Python 版本

$ pyenv global 3.8.0

2. pyenv 是怎么工作的

pyenv 的工作原理非常巧妙,它通过在 $PATH 前,加了一层 shims 实现。

我们应该知道 $PATH 的作用 —— 当我们在 shell 执行一个命令时,系统会遍历 $PATH ,找不到就 command not found

我们可以使用以下命令看下自己的 $PATH

$ echo $PATH

在安装 pyenv 后,我们应该会在 PATH 的靠前位置看到 /Users/xq.jin/.pyenv/shims,这个就是 pyenv 为我们加的 shims 了。

打开该文件夹,可以看到,这里有很多的 shims —— 它们与 venv 里提到的 env/bin 里的可执行文件是一一对应的。

有了这层 shims,我们执行的 pythonpipblack 等命令,其实都是这些 shims。

而 shims 在执行时,就会按下图的逻辑帮我们选好 Python 版本了。

3. 更新 shims

因为在安装时 pyenv 在我们 ~/.zshrc 里写入了 eval "$(pyenv init -)",所以每打开一个 shell 会话,pyenv 都会帮我们同步一次 env/bin 里的命令到 shims。但当然,这有时可能没那么及时,也就是说,有时你执行的命令可能不是 shims,不过我们总是可以手动同步它们一下:

pyenv rehash