使用pyenv进行Python版本与虚拟环境的管理

使用Python,尤其是运行机器学习相关的程序时,有两个经常需要面临的问题:Python的版本、Python依赖包的版本。pyenv可以方便地进行Python版本的管理;再结合pyenv-virtualenv插件,通过对不同项目创建不同的虚拟环境来应对依赖包的版本问题。

这篇文章是基于Ubuntu 18.04 LTS进行的介绍,其它类Unix系统的安装使用可以去项目的主页自行查看。

pyenv项目主页:https://github.com/pyenv/pyenv

pyenv-virtualenv项目主页:https://github.com/pyenv/pyenv-virtualenv

pyenv的原理

当我们在命令行中输入python时,系统会读取一个称为PATH的环境变量,其中包含了许多用冒号分隔的路径,从左向右对这些路径对应的文件夹进行搜索,当遇到一个名称为python的文件时,便对其进行执行。下面的代码展现了环境变量PATH的内容。

基于此,pyenv将自己的目录放在PATH变量的最前面,并且该目录包含诸如python、pip的文件(它们被称为shim,意为垫片)。这样,pyenv就拦截了执行python的命令。这些shim将命令传递给pyenv,根据设置决定运行哪个版本的python。该决策根据以下优先级进行:

  1. 读取环境变量PYENV_VERSION进行决定,该变量可以根据pyenv shell命令设置。
  2. 读取当前目录下的.python-version文件进行决定,该文件由pyenv local命令设置。
  3. 递归搜索父目录,由找到的第一个.python-version文件决定。
  4. 读取$(pyenv root)/version文件进行决定,该文件由pyenv global命令设置。$(pyenv root)代表安装pyenv的根目录。
  5. 如果上面的步骤都失败,交由PATH中其他路径处理,效果与不使用pyenv相同。

安装pyenv(Ubuntu下适用)

下载项目到~/.pyenv目录。

将pyenv添加到PATH中。

使能shim与命令自动补全。

--- update 2021/06/29 ---

使能shim的“pyenv init -”命令被更改为了“pyenv init --path”,因此上述命令修改为:

--- update end ---

重启shell使得更改生效。

安装必要的软件包支持pyenv的运行。

使用举例

当使用pyenv global进行设置时,可能由于全局版本的切换影响其它软件。为了尽可能减少影响,推荐使用pyenv local对工作目录进行版本设置

使用pyenv-virtualenv插件管理虚拟环境

通过pyenv-virtualenv插件,可以为不同的项目创建不同的虚拟环境,进而安装不同的python依赖包。pyenv-virtualenv的安装很简单。

使用举例

真实案例

github上的一个项目的环境要求如图中Requirements所示。

为了创建相符的环境,执行如下命令。

TIME: 2021/02/18 返回首页