Python虚拟环境管理

在另外一篇文章已经讲了Python版本管理。本文主要讲Python虚拟环境管理。有了这两个方面的工具,就可以实现在Python的不同版本不同虚拟环境间方便地切换。

pyenv-virtualenv一般会随pyenv一起安装,也可以通过下文方式独立安装。

什么是虚拟环境

一种采用协作式隔离的运行时环境,允许Python用户和应用程序在安装和升级Python分发包时不会干扰到同一系统上运行的其他Python应用程序的行为。

虚拟环境其实是一个目录树,其中安装有特定Python版本,以及许多其他包。

为什么需要虚拟环境

Python应用程序通常会使用非标准库内的软件包和模块。因为可能需要修复特定的错误,或者使用库的过时版本的接口,应用程序有时需要特定版本的库。

这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的1.0版本,但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。

这个问题的解决方案就是创建一个虚拟环境。然后,不同的应用将可以使用不同的虚拟环境。 要解决先前需求相冲突的例子,应用程序A可以拥有自己的安装了1.0版本的虚拟环境,而应用程序B则拥有安装了2.0版本的另一个虚拟环境。如果应用程序B要求将某个库升级到3.0版本,也不会影响应用程序A的环境。

pyenv-virtualenv

pyenv-viralenv是一个pyenv插件,它提供了在类UNIX系统上管理虚拟环境和conda环境的特性。

pyenv-virtualenvwrapper是pyenv的另外一个管理虚拟环境的插件。选择pyenv-virtualenv的原因是,pyenv-virtualenvwrapper有助于与virtualenvwrapper进行交互,但是pyenv-virtualenv提供了更方便的命令,其中virtualenvs是第一种pyenv版本,可以(反)激活。也就是说,pyenv和virtualenvwrapper仍然是分开的,而pyenv-virtualenv是一个很好的组合。

安装

下面将把最新开发版本的pyenv-virtualenv安装到$(pyenv root)/plugins/pyenv-virtualenv目录中。

重要提示: 如果将pyenv安装到一个非标准目录中,请确保将该仓库克隆到安装位置的“plugins”目录中。

在这个目录中可以:

  • 检出特定的发布版标签。
  • 通过运行git pull来下载最新的更改,从而获得最新的开发版本。
    1. 检出pyenv-virtualenv至插件目录
      1
      git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
    2. (可选)添加pyenv virtualenv-init至shell来自动激活虚拟环境。这完全是可选的,但是非常有用。请参阅下面的“激活虚拟环境”。
      1
      echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
    3. 重启shell以启用pyenv-virtualenv
      1
      exec "$SHELL"

使用

与pyenv一起使用pyenv virtualenv

要与pyenv一起使用创建Python版本的虚拟环境,运行pyenv virtualenv,指定所需的Python版本和虚拟环境目录的名称。例如:

1
$ pyenv virtualenv 3.13.1 scrat

将在$(pyenv root)/versions目录下一个名为scrat的文件夹中,创建一个基于Python 3.13.1的虚拟环境。

pyenv virtualenv将任何选项转发给实际创建虚拟环境的底层命令(conda、 virtualenv或python -m venv)。有关详细信息,请参阅pyenv virtualenv –help的输出。

从当前版本创建虚拟环境

如果只有一个参数提供给pyenv virtualenv,那么将根据当前pyenv的Python版本并使用给定的名称创建虚拟环境。

1
2
3
$ pyenv version
3.13.1 (set by /home/zhangjc/.pyenv/version)
$ pyenv virtualenv venv3.13.1

列出已有的虚拟环境

pyenv virtualenvs显示已有的虚拟环境和conda环境列表。

1
2
3
$ pyenv virtualenvs
3.13.1/envs/scrat (created from /home/zhangjc/.pyenv/versions/3.13.1)
scrat (created from /home/zhangjc/.pyenv/versions/3.13.1)

每个虚拟环境有两个条目,较短的条目只是一个符号链接。

激活虚拟环境

一些外部工具(例如jedi)可能需要您激活虚拟环境和conda环境。

如果eval “$(pyenv virtualenv-init -)”在shell中配置,当进入/离开包含.python-version文件时会自动激活对应的虚拟环境,前提是.python-version中的虚拟环境的名称是有效的。使用pyenv virtualenvs命令查看有效虚拟环境清单,如上例中的scrat。pyenv使用.python-version文件来表示本地Python版本,可以使用pyenv local命令创建和删除这些文件。

可以手动激活和停用一个pyenv虚拟环境:

1
2
pyenv activate <name>
pyenv deactivate

删除已有的虚拟环境

删除$(pyenv root)/versions和$(pyenv root)/versions/{version}/envs中的目录将删除虚拟环境,或者您可以运行:

1
pyenv uninstall my-virtual-env

也可以使用virtualenv-delete命令删除已有的虚拟环境,例如,可以运行:

1
pyenv virtualenv-delete my-virtual-env

这将删除名为my-virtual-env的虚拟环境。

特殊环境变量

可以设置某些环境变量来控制pyenv-virtualenv。

  • PYENV_VIRTUALENV_CACHE_PATH:如果设置了,则指定一个目录用于缓存下载的包文件。
  • VIRTUALENV_VERSION:如果设置了,则强制pyenv-virtualenv安装所需的virtualenv版本。如果没有安装virtualenv,pyenv-virtualenv将尝试安装给定版本的virtualenv。
  • GET_PIP:如果设置了并且venv优于virtualenv,则从指定位置使用get_pip.py。
  • GET_PIP_URL:如果设置了并且venv优于virtualenv,则从指定的URL下载get_pip.py。
  • PIP_VERSION:如果设置了并且venv优于virtualenv,则安装指定版本的pip。
  • PYENV_VIRTUALENV_VERBOSE_ACTIVATE:如果设置了,则显示一些关于激活和停用的详细输出。