Python虚拟环境:告别混乱,实现高效隔离

4 阅读5分钟

本文详细介绍了Python虚拟环境,强调其隔离依赖、防止冲突的作用,并通过教程演示了创建和使用方法,确保项目独立运行。

译自:Python virtual environments: isolation without the chaos

作者:Jessica Wachtel

全局安装软件包并非总是最佳实践。应用程序中的不同工具可能需要特定版本的功能、函数或依赖项。这些可能与同一应用程序的其他部分或系统上的其他项目发生冲突或导致其崩溃。有一个简单的解决方案:本地安装而非全局安装。在软件开发中,倾向于更多本地安装并非新理念。开发的核心原则之一是使用轻量级、隔离的设置和模块化代码。这使得代码保持内聚、模块化和可预测。

这些相同的理念推动了基于容器的开发(例如 Docker)的兴起。容器 隔离应用程序及其依赖项,使其能够在不同环境中可靠运行。虚拟环境在语言层面应用了相同的原则。它们允许你为特定项目(无论大小)隔离依赖项,而不会影响系统上的任何其他内容。

什么是虚拟环境?

虚拟环境(又称虚拟环境)是一种隔离的安装,直接存在于你的项目目录中。可以将其视为一个项目专属的独立工作区。

Python 中,每个虚拟环境都包含自己的 Python 解释器、包安装器 (pip) 和已安装的库。这些并非虚拟环境所独有,每个 Python 项目都包含这些元素。使用虚拟环境构建的项目之间的区别在于,所有内容都是隔离的。每个环境都有自己的 Python 解释器、pip 和库副本,因此一个项目中的更改不会影响任何其他项目或系统 Python。

全局安装并非总是有问题,但有时会。例如:

  • 项目 A 需要 requests 2.25 版本
  • 项目 B 需要 requests 2.31 版本

全局环境中,一次只有一个包版本处于活动状态。然而,有了虚拟环境,每个项目都可以拥有自己的版本,从而使两个项目独立工作。这种隔离使得应用程序更易于维护。例如,一个新版本可能破坏项目 A,但却是项目 B 所必需的。它还使项目更可靠,并且实验起来更安全。

虚拟环境易于使用。本教程的其余部分将在同一个项目中构建两个 Python 虚拟环境,以展示每个环境如何拥有自己的包并从相同的 Python 脚本中产生不同的结果。

虚拟环境并非 Python 独有,但本教程将使用 Python 语言。请在开始之前确保你的机器上已安装 Python。

构建 Python 虚拟环境

在你的 IDE 中打开一个新项目,让我们设置文件夹:

一旦你进入新文件夹,我们就可以构建虚拟环境了。我们将构建两个虚拟环境。

成功完成后,你将看到一个名为 venv 的新文件夹,其下有一个新的文件夹/文件树。你应该会看到 venv_oldvenv_new

激活 Python 虚拟环境

我们首先在 venv_old 上工作。在你的终端中使用以下命令。不要 cd 进入 venv 文件夹。在父文件夹 build_venv 中运行时执行以下命令。

然后你将在终端的命令提示符前看到 (venv)

在 Python 虚拟环境中安装包

现在我们准备将 numpy 安装到 venv_old 中。这个过程看起来类似于全局安装,但它只会在虚拟环境中安装 numpy

在虚拟环境中运行 Python

接下来,我们将创建 main.py 文件。如果未安装 numpymain.py 中的代码将无法运行(稍后会详细介绍)。

创建文件。

一旦 main.py 出现在你的文件夹树中,将此代码添加到文件中。

添加后,在终端中运行以下代码。快速提示:在我的终端中运行 Python 脚本的命令是 python3。你的可能是 python 或其他完全不同的命令。你可以通过运行 python --versionpython3 --version 来检查并继续排查问题。

成功完成后,你将在终端中看到一个随机数。

停用 Python 虚拟环境

在我们可以在 venv_new 中测试 main.py 之前,我们需要停用 venv_old。你可以通过在终端中输入以下内容来完成。

在第二个虚拟环境中工作

现在,让我们激活 venv_new

运行 main.py

你应该会看到一个错误,因为 numpy 未安装在 venv_new 中。

如果你随后停用 venv_new 并在没有虚拟环境的情况下运行 main.py,你将看到一个随机数。这是因为 Python 使用系统或用户安装的包,因此你的脚本仍然可以找到 NumPy 并成功运行。虚拟环境只隔离该环境内部的包,因此如果没有虚拟环境,Python 会回退到全局或为你的用户安装的任何包。

使用虚拟环境

这个简单的设置展示了虚拟环境如何让你精确控制每个项目使用的包,从而防止冲突并使实验安全。即使在一个小型项目中,隔离依赖项也能在未来省去很多麻烦。