Python 的版本管理是在实践中一定会面对的问题。pyenv 是一个简单的 Python 版本管理程序。使用 pyenv 可以在多个 Python 版本间进行切换。本文主要参考项目文档进行翻译和编写。大概的使用效果如下图所示:
pyenv 可以做什么...
-
允许您根据每个用户更改全局 Python 版本。
-
提供对每个项目 Python 版本的支持。
-
允许用环境变量覆盖 Python 版本。
-
一次从多个版本的 Python 中搜索命令。这有助于使用 tox 跨 Python 版本进行测试。
与 pythonbrew 和 pythonz 相比,pyenv 不能做什么...
-
取决于 Python 本身。 pyenv 是由纯 shell 脚本构成的。 Python 不存在引导问题。
-
需要加载到 shell 中。相反,pyenv 的接入通过在 PATH 中添加一个目录来工作。
-
当然,可以创建 viralenv,或者创建 pyenv-viralenv 来自动化这个过程。但管理会比较繁琐,并容易产生混乱。
pyenv 如何工作
在高级别上,pyenv 使用注入到 PATH 中的可执行文件拦截 Python 命令,确定应用程序指定了哪个 Python 版本,并将命令传递到正确的 Python 安装。
理解 pyenv 的 Shims
pyenv 的工作原理是在 PATH 前面插入一个 shims 目录来工作:
$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin
通过一个称为重拼凑的过程,pyenv 在该目录中维护 shims,以匹配每个已安装版本 Python 的命令 ー Python、 pip 等。
Shims 是轻量级的可执行文件,只需将命令传递给 pyenv 即可。因此,安装了 pyenv 之后,当运行 pip 时,操作系统将执行以下操作:
-
在 PATH 中搜索名为 pip 的可执行文件。
-
在 PATH 的开头找到名为 pip 的 pyenv shim。
-
运行名为 pip 的 shim,然后将命令传递给 pyenv。
理解 Python 版本选择
当执行一个 shim 时,pyenv 通过从以下来源读取它来决定使用哪个 Python 版本,顺序如下:
-
PYENV_VERION 环境变量(如果指定)。您可以使用 pyenv shell 命令在当前 shell 会话中设置这个环境变量。
-
当前目录中应用指定的 .python-version 文件(如果存在)。可以使用 pyenv shell 命令修改当前目录的 .python-version 文件。
-
通过搜索每个父目录找到第一个 .python-version 文件(如果有的话),直到文件系统的根目录。