原文: How to Set Up a Virtual Environment in Python – And Why It's Useful

当用 Python 开发软件时,一个基本的方法是在你的机器上安装 Python,通过终端安装所有需要的库,在一个 .py 文件或笔记本中编写所有的代码,并在终端运行你的 Python 程序。

这是很多初学者和很多从使用 Python 进行数据分析过渡的人的常用方法。

这对于简单的 Python 脚本项目来说效果很好。但是在复杂的软件开发项目中,比如构建一个 Python 库、一个 API 或者软件开发工具包,往往你要处理多个文件、多个包和依赖关系。因此,你将需要为该特定项目隔离你的 Python 开发环境。

考虑这种情况:你正在开发应用程序 A,使用你的系统安装的 Python 和你 pip install 安装的 packageX 1.0 版本到全局 Python 库。然后你切换到本地机器上的项目 B,并安装了相同的 packageX,但版本为 2.0,在 1.0 和 2.0 之间有一些突破性的变化。

当你回去运行你的项目 A 时,你遇到了各种各样的错误,而且你的项目不能运行。这是你在用 Python 构建软件时可能遇到的情况。而为了解决这个问题,我们可以使用虚拟环境。

本教程将介绍你需要知道的关于虚拟环境的一切,以及如何用 Virtualenv 设置一个虚拟环境。

什么是虚拟环境

根据 Python 官方文档,

“虚拟环境是一个 Python 环境,这样安装在其中的 Python 解释器、库和脚本就与安装在其它虚拟环境中的、以及(默认)安装在“系统” Python(也就是作为操作系统的一部分安装的库)中的任何库隔离。

当你为你的项目激活一个虚拟环境时,你的项目就变成了它自己的独立应用,独立于系统安装的 Python 及其模块。

你的新的虚拟环境有自己的 pip 来安装库,有自己的库文件夹,新的库被添加到这里,还有自己的 Python 解释器,用于激活环境的 Python 版本。

有了这个新环境,你的应用程序变得自成一体,你会感受到一些好处,比如:

  • 你的开发环境包含在你的项目中,并且不干扰你的系统安装的 Python 或其他虚拟环境
  • 你可以为多个 Python 版本创建一个新的虚拟环境
  • 你能够下载软件包到你的项目中,而不需要管理员的权限
  • 你可以很容易地将你的应用程序打包,并与其他开发者分享,进行复制
  • 你可以很容易地在一个文件中为你的项目创建一个依赖和子依赖的列表,这使得其他开发者可以很容易地复制和安装你的环境中使用的所有依赖项

一般由一个 Python 脚本发展而来的软件开发项目可以使用虚拟环境。Python 提供了多种创建和使用虚拟环境的方法。

在下面的章节中,我们将介绍如何创建你的虚拟环境,使用 venv,它可以让你对环境有更多的底层控制。

另一种设置虚拟环境的常用方法是使用 pipenv,它是一种更高级的方法。

如何使用 Venv 安装虚拟环境

Virtualenv 是一个用于设置 Python 环境的工具。从 Python 3.3 开始,它的一个子集被整合到标准库的 venv 模块下。你可以通过在终端运行这个命令将 venv 安装到你的 Python 主机上:

pip install virtualenv

要在你的项目中使用 venv,你需要在终端中创建一个新的项目文件夹,在终端中使用 cd 切换到项目文件夹,并运行以下命令:

 python<version> -m venv <virtual-environment-name>

像这样:

 mkdir projectA
 cd projectA
 python3.8 -m venv env

当你检查新的 projectA 文件夹时,你会注意到已经创建了一个名为 env 的新文件夹。env 是我们的虚拟环境的名称,但你也可以给它别的名字。

如果我们检查一下 env 的内容,在 Mac 上你会看到一个 bin 文件夹。你还会看到通常用来控制你的虚拟环境的脚本,比如安装库的 activate 和 pip,以及你安装的 Python 版本的 Python 解释器,等等。(这个文件夹在 Windows 下将被称为 Scripts)。

lib文件夹将包含一个你已经安装的库的列表。如果你看一下,你会看到虚拟环境中默认的库的列表。

如何激活虚拟环境

现在你已经创建了虚拟环境,你将需要在你的项目中使用它之前激活它。在 Mac 上,要激活你的虚拟环境,运行下面的代码:

source env/bin/activate

这将激活你的虚拟环境。你立刻会注意到你的终端路径包括了 env,这标志着一个激活的虚拟环境。

请注意,要在 Windows 上激活你的虚拟环境,你需要运行下面的代码(查看这个链接以充分了解平台之间的差异):

 env/Scripts/activate.bat //In CMD
 env/Scripts/Activate.ps1 //In Powershel

虚拟环境在运行吗

我们已经激活了虚拟环境,现在我们如何确认项目实际上已经与主机 Python 隔离了呢?我们可以做几件事。

首先,我们通过在激活的虚拟环境中运行下面的代码来检查虚拟环境中安装的软件包列表。你会注意到只有两个包--pip 和 setuptools,它们是新的虚拟环境中默认的基本包。

pip list

接下来你可以在一个没有激活虚拟环境的新终端中运行上面的相同代码。你会注意到在你的主机 Python 中多了很多库,你可能在过去已经安装了。这些库在你安装之前并不是你的 Python 虚拟环境的一部分。

如何在虚拟环境中安装库

要安装新的库,你可以很容易地只用 pip 安装这些库。虚拟环境将使用它自己的 pip,所以你不需要使用 pip3。

在安装完所需的库后,你可以通过使用 pip list 来查看所有安装的库,或者你可以通过运行下面的代码来生成一个列出所有项目依赖的文本文件:

pip freeze > requirements.txt

你可以把这个 requirements.txt 文件命名为你想要的任何名字。

需求文件

为什么需求文件对你的项目很重要?考虑到你把你的项目打包在一个 zip 文件中(没有 env 文件夹),然后你和开发者朋友们分享。

要重新创建你的开发环境,你的朋友只需要按照上面的步骤来激活一个新的虚拟环境。

他们不必逐一安装每个依赖项,而只需运行下面的代码,在他们自己的项目副本中安装你的所有依赖项:

 ~ pip install -r requirements.txt

注意,通常不建议分享你的 env 文件夹,它应该很容易被复制到任何新环境中。

通常你的 env 目录会被包含在一个 .gitignore 文件中(当使用 GitHub 这样的版本控制平台时),以确保环境文件不会被推送到项目库中。

如何停用虚拟环境

要停用你的虚拟环境,只需在终端运行以下代码:

 ~ deactivate

总结

Python 虚拟环境使你有能力将你的 Python 开发项目与你的系统安装的 Python 和其它 Python 环境隔离开来。这使你能够完全控制你的项目,并使其易于重现。

当开发一般从简单的 .py 脚本或 Jupyter 笔记本中发展出来的应用程序时,使用虚拟环境是一个好主意——现在你知道如何设置并开始使用一个虚拟环境了。