我们从事的项目很可能有许多需要安装的依赖项。这些依赖关系促进了项目中的许多任务。然而尤其是在处理多个项目时,我们需要很小心。
就像任何其他技术一样,软件包或编程语言也在不断改进。因此正在推出新的版本。
不同的项目可能需要不同版本的包或软件。例如,我们可能有一个项目需要Python/ target=_blank class=infotextkey>Python2.7,另一个项目需要Python3.6。随着项目和依赖项数量的增加,很难跟踪和处理这些差异。
克服这个问题的一种方法是使用虚拟环境。它们可以被视为软件包的边界框。我们可以在虚拟环境中开发一个项目,并安装特定于该项目的所有依赖项。我们在虚拟环境中拥有的东西不受机器全局范围变化的影响。
Python有许多虚拟环境工具,如pipenv、virtualenv、venv等。在本文中,我们将讨论一些使用virtualenv和pipenv的示例,以熟悉虚拟环境的概念及其工作方式。
让我们从virtualenv开始。首先使用python包安装程序(pip)从终端安装它。
$ pip install virtualenv
创建一个示例项目文件作为工作目录。
$ mkdir demoproject
$ cd demoproject
现在在demoproject目录中。我们将使用以下命令创建一个虚拟环境。
$ virtualenv venv_demo
它被创造出来了。我们可以运行ls命令来查看当前工作目录中的文件。
$ ls
venv_demo
下一步是激活虚拟环境。
$ source venv_demo/bin/activate
一旦虚拟环境被激活,其名称将显示在终端中,如下所示:
现在可以安装软件包了。
$ python -m pip install pandas
我们现在在虚拟环境中安装了pandas。freeze命令显示已安装软件包的列表。
$ python -m pip freeze
numpy==1.19.4
pandas==1.1.5
python-dateutil==2.8.1
pytz==2020.5
six==1.15.0
NumPy也被安装了,因为它是pandas的依赖。pandas的安装版本是1.1.5。我们可以在安装软件包时指定所需的版本。
$ python -m pip install pandas==1.0.5
如果你只想检查特定软件包的已安装版本,请将freeze命令与grep一起使用:
$ pip freeze | grep pandas
pandas==1.0.5
我们还可以安装保存在文本文件中的几个软件包。这比一个接一个地安装依赖项要好,尤其是当有多个依赖项时。
$ python -m pip install -r requirements.txt
为了退出虚拟环境,我们使用deactivate命令。
$ deactivate
我们将发现的下一个工具是pipenv,它可以使用pip安装:
$ pip install pipenv
使用pipenv创建一个新的虚拟环境。
$ pipenv install --python=/usr/bin/python3.6
Pipenv允许在创建虚拟环境时安装依赖项。例如,我可以在上面的命令末尾添加pandas,这样就可以创建安装了pandas的虚拟环境。
运行shell命令来激活虚拟环境。
$ pipenv shell
我们现在处于虚拟环境中。也给这个安装pandas吧。
$ pipenv install pandas
graph命令显示已安装软件包的详细概述。
$ pipenv graph
pandas==1.1.5
- numpy [required: >=1.15.4, installed: 1.19.4]
- python-dateutil [required: >=2.7.3, installed: 2.8.1]
- six [required: >=1.5, installed: 1.15.0]
- pytz [required: >=2017.2, installed: 2020.5]
我们可以使用uninstall命令卸载虚拟环境中的特定包或所有包。
$ pipenv uninstall pandas
以下命令将卸载所有包。
$ pipenv uninstall -all
键入“exit”命令退出虚拟环境。
虚拟环境是同时管理多个项目的好工具。有许多软件包和库可以很快更新。因此,试图手动更新效率不高。
本文介绍的内容可以看作是Python虚拟环境的实用介绍。当然,在理论和实践上还有很多东西要学。
virtualenv(https://virtualenv.pypa.io/en/latest/)和pipenv(https://github.com/pypa/pipenv)的官方文档提供了关于这些工具的更详细的概述。