Python虚拟环境
#发展 #python #设置 #environment

包装和模块化是每个相关编程语言中都存在的出色功能,因为它允许我们(开发人员)轻松地重复使用经常性代码段(模块)。

在Python中,我们可以通过使用PIP(例如pip)安装一些软件包来添加软件包作为我们项目的依赖项:

pip install requests==2.30.0
pip install pytest pytest-cov

在示例中,我们正在在第一行中安装库requests版本2.30.0,在第二行中,我们正在安装库pytestpytest-cov。由于我们没有为pytest和pytest-cov指定任何版本,因此我们将安装最新版本。

这很酷,但是当同时从事多个项目或与他人共享项目时,或者我们使用机器学习时会出现问题。特定项目包的管理变得具有挑战性。

全局安装的缺点(非虚拟环境)

在开始虚拟环境之前,让我们想象一个情况。
假设您已经开始在一个新项目中,您必须为此安装pandasrequestsjinja。您只需运行:

pip install Jinja2 requests pandas

之后,您将与其他人共享此项目,当然,您将使用git将其版本发送给您的远程存储库,例如github。现在,其他人需要为您的项目做出贡献,但是当他们尝试运行它时,他们只会看到一条错误消息,说“没有名为'pandas'的模块”,这是有道理的,因为您仅在此处共享您的源代码存储库,而不是您的整个设置(Python,已安装软件包,环境等)

Screenshot showing error no module named pandas

要解决这个问题,您可以简单地向项目中的工作人员提供指示,以运行pip install Jinja2 requests pandas。但这并不能完全解决问题。有些人可能已经在机器中安装了一些不同版本的请求,这不会引起与以前相同的错误,但是它可能会引起与所使用的不同版本之间的不兼容有关的不同错误 - 现在您说“它在我的机器上起作用!”

因此,您将需要一种与人们共享当前项目中使用的完全相同版本的方法,以使其正常工作。幸运的是,Python为此提供了一个解决方案:pip的子命令freeze。使用此命令,您可以使用其指定的版本输出所有依赖项(包括原始依赖项的下降 - 依赖关系图),然后您可以使用此输出来创建一个文本文件,该文件可用于安装正确的依赖项:

pip freeze > requirements.txt

上面的命令是Python中的一个常见模式,可以创建一个迄今已安装的依赖项的requirements.txt文件(它使用当前已安装的版本“冻结”它们)。然后,当您想在新机器中设置项目时,您可以运行:

pip install -r requirements.txt

此命令将安装您在requirements.txt文件中拥有的所有内容。

注意:确保将此文件放在源代码的根源上。

现在,我们有一个简短的命令来安装每个依赖关系,我们只需要确保requirements.txt每次在项目中包括新的依赖项时运行pip freeze > requirements.txt是最新的,对吗?不完全是。我们仍然有问题。

还记得我们第一次安装了requests 2.30pytestpytest-cov在本文的开始时吗?这些库不是我们稍后启动的项目依赖关系的一部分,但是您会注意到您的requirements.txt仍然包括它们(以及所有依赖性树)。看看:

Content of the requirements file highlighting requests and pytest dependencies

这可能是一个问题,因为它将为该项目安装不需要的软件包,甚至可能影响pip install解决我们的依赖性的方式。此外,想象一下当我们需要与同一机器中不同项目的不同版本的不同版本一起工作时,我们将遇到的混乱...

要克服这个问题,我们可以使用Python的虚拟环境。

Python的Venv

python中的虚拟环境 - 简称VENV - 是将您的项目上下文(Python解释器,库安装等)隔离的资源。实际上,在虚拟环境下安装的软件包不会与机器中安装的软件包发生冲突。对于您正在从事的每个项目,拥有不同的VENV是最好的做法。接下来,我们将看到一个逐步使用和理解VENV的指南。

创建VENV

Python配备了一个内置模块来创建虚拟环境。它称为venv,您可以使用它来创建一个新的虚拟环境:

python -m venv venv
# note: in your system, python command may be under other name
# like python3 or just py instead of python...

在上述命令中,python -m venv是创建新的虚拟环境的命令,而最后一个venv只是您虚拟环境的名称。它将用于创建包含Python解释器,已安装库的本地文件夹等。它可能是任何其他名称,venv是最常用的名称。

Terminal with virtual environment creation command

注意:
不必担心此命令生成的文件夹venv
它将由Python管理,您将永远不必触摸它。

现在创建了您的VENV,但尚未活跃,因此您仍然处于常规环境中。

激活VENV

现在我们有了该项目的VENV,我们可以激活它以利用其利益。

# Linux and MacOS:
source myvenv/bin/activate

# Windows
.\venv\Scripts\activate

您会注意到venv或您给VENV的任何名称 - 在您的命令行上以绿色出现,表明您的虚拟环境已被成功激活,现在您正在运行。

Terminal after run the activate script

不必担心您的外壳配置,它主要是未修改的。您的Python解释器会更改为VENV中包含的解释器。

在VENV上工作

首先要注意的是,您无法访问您在全球安装的软件包和模块。例如,试图导入大熊猫,例如,您筹集了ModuleNotFoundError。这很有意义,我们现在正在一个全新的环境中。

让我们尝试重新安装所需的依赖项并冻结它们。

pip install Jinja2 requests pandas
pip freeze > requirements.txt

请注意,您可以像在虚拟环境之外一样使用pythonpip命令。不同之处在于,pippython来源是VENV而不是您的全局安装。

查看以前的requirements.txt(左侧)与虚拟环境中生成的新的requirements.txt(左侧)之间的区别:

Comparison between the requirements file before and after virtual environment

从22岁开始,我们进入了13个依赖项。这是9个依赖性的减少。基本上比以前少40%!

注意:
关闭终端或IDE时,虚拟环境将被停用。
因此,您必须每次打开它再次激活它。

停用VENV

只要您需要停用VENV才能返回“全球环境”,就可以简单地运行停用脚本。

deactivate 

进一步的考虑

完美,现在我们可以使用虚拟环境来为我们正在研究的每个项目都有一个孤立的上下文,但是仍然有一些最后的观察。

git

虚拟环境目录可能包含很多文件,并且大小往往很大。另外,软件包管理器在不同的机器中可能不会以相同的方式工作,因此在使用Git时,您应该在.gitignore文件中包含venv文件夹。这样,您只能将源代码保存在远程存储库中,并且任何人都可以复制venv,并且软件包管理器将尽最大努力以正确的方式安装依赖关系。

CI/CD管道

在CI/CD管道中,通常我们已经有一个完全隔离的环境,因此在安装依赖项之前,无需在脚本中添加命令来创建和激活虚拟环境。在这些情况下,您可以直接进入Python脚本的安装和执行。

VSCODE用户

Vscode中的Python有一些很酷的扩展,但我认为,重要的是Microsoft的Python。

Python extension on VSCode extensions store

此扩展名带来了诸如IntelliSense,Debugging等功能。
为了利用此扩展的功能,您必须确保当前选择的Python解释器是您的VENV之一(假设您在VENV中工作)。

让我们假设我已经为我的项目(仅在VENV上)添加了一个新的依赖性

pip install matplotlib
pip freeze > requirements.txt

如果我们不选择正确的python解释器:

VSCode alerting matplotlib was not found

请注意,我们在VENV中安装了Matplotlib,但我们仍然有警告说无法解决Matplotlib。看看如果我们尝试从vscode“运行按钮”运行它,我们会得到什么:

VSCode finishing python script execution with error on run with play button

如果我们尝试使用venv Active从终端运行:

Execution with success on run in command line with virtual environment active

这意味着VSCODE使用了错误的解释器。解决这个问题非常容易。您只需要在右下角击中python解释器(图中用红色标记)和将打开的上部面板,选择正确的解释器(您可以通过路径识别正确的解释器 - 还标记为红色) 。

Selecting the correct python interpreter in VSCode config

之后,警告将消失,您的IntelliSense会正常工作,并且运行按钮将不再导致错误:

VSCode working fine after selecting the correct interpreter

也很有趣的是,在右下角将显示您的venv解释器。


总而言之,虚拟环境是管理依赖关系并在Python中创建孤立的项目上下文的强大工具。它们有助于确保一致的安装并防止不同项目之间的冲突。

如果您想在虚拟环境中更深入,请还检查https://realpython.com/python-virtual-environments-a-primer/