在隔离环境中分离项目的依赖关系时,Python 虚拟环境是开发者的一个重要工具。如果在本地进行几个 Python 项目的工作,开发者可能需要在每个项目上使用不同的 Python 版本。
通过这样做,他们将能够安装不同的包,并为每个环境拥有不同版本的命名包。
然而,这可能会产生很多兼容性问题,除非你使用虚拟环境正确地管理它们。有很多方法可以做到这一点,我将强调两个工具:Pyenv 和Pipenv。
Python 虚拟环境
在下面的图片中,你可以看到一个抽象的例子,不同的Python项目包含了你可以安装的不同组合的软件包。

每个大的彩色方框代表一个 Python 虚拟环境。某些包的版本只被确定的 Python 版本所支持是很常见的。另外,你可能在一个项目中需要一个确定的软件包版本,而在其他项目中需要另一个版本。除此以外,一个确定的包的版本可能与包或 Python 版本产生冲突。
可以发现许多兼容性问题的组合,但通过拥有这些隔离的环境,你可以避免它们。你将能够在一个虚拟环境中进行安装、卸载、更新等,而不影响其余的环境。如前所述,有很多工具可以做到这一点,我将谈谈我认为容易理解和使用的工具。
Pyenv
Pyenv是一个用于管理不同Python版本的工具。通过这个工具,你可以:
- 安装多个Python版本。
- 设置/改变你电脑中的全局(默认)Python版本。
- 为一个项目设置/改变本地的 Python 版本。
- 创建和管理虚拟环境。
安装
在macOS上,你可以用Homebrew安装这个工具:
brew install pyenv
要在其他平台上安装它,你可以看GitHub文档中的这一部分。安装完成后,编辑你使用的shell启动脚本(.bashrc,.zshrc,.bash_profile, ...),添加以下一行:
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
然后重新加载你的shell启动脚本。一个例子是,如果你有.bashrc :
cd
source .bashrc
就这样了!你已经成功地安装了 Pyenv。
管理 Python 版本
现在让我们来看看你可以通过 Pyenv 安装的可能的 Python 版本,执行:
pyenv install --list
你会看到一个很大的 Python 版本列表。你可以挑选一个来安装,比方说 3.9.1:
pyenv install 3.9.1
你可以用你想在你的计算机上安装的任何版本运行该命令。要查看所有已安装的版本,只需运行:
pyenv versions
另外,你可以设置你想在系统中使用的全局版本,这将是默认版本。例如,如果你已经安装了3.8.8,你可以把它设置为运行的全局版本:
pyenv global 3.8.8
当然,你可以通过再次执行该命令来改变这一情况,并使用所需的安装版本。如果你想检查你的全局版本,只需运行:
python -V
使用Pyenv,你可以为每个项目设置一个全局和一个本地版本。要设置一个本地版本,请在终端中进入项目文件夹:
cd ~/path/to/the/project/folder
并设置本地版本,例如,3.9.1:
pyenv local 3.9.1
这将在文件夹中创建一个.python-version 文件,表明该项目当前的本地 Python 版本。另外,如果你在该文件夹中运行python -V ,你将看到本地版本,而不是全局版本。
因此,总结一下,你有以下有用的命令可以使用:
pyenv install --list查看你可以安装的 Python 版本。pyenv versions查看已安装的 Python 版本。pyenv global <Python version>将已安装的 Python 版本设置为全局版本。pyenv local <Python version>为某个项目文件夹设置已安装的 Python 版本。pyenv uninstall <Python version>卸载一个已经安装的 Python 版本。
Pyenv也允许我们用一个叫做pyenv-virtualenv的插件来管理环境。然而,我更喜欢使用Pipenv。让我们来看看。
Pipenv
Pipenv是一个用来管理Python项目中所需要的软件包的工具。使用这个工具,你可以
- 自动创建或删除一个虚拟环境。
- 安装、卸载和更新软件包,保持所需的版本。
- 快速建立一个可以工作的 Python 环境。
- 拥有一个已安装软件包和相应版本的列表。
如果你在你的项目中使用Pipenv,你将在根目录下有两个特殊的文件,都是自动生成和改变的。这两个文件是
Pipfile:一个指定你的虚拟环境中已安装的软件包的文件,用于开发和执行。Pipfile.lock:一个文件,指定要使用哪个版本的已安装包(在Pipfile中详细说明)。也有另一个重要的元数据。
使用Pipenv,非常容易与其他使用相同软件包和版本的开发者一起进行项目工作,因为它提供了包含所有这些信息的文件。开发人员必须简单地运行一个命令,在他们自己的计算机中拥有相同的环境。
安装
在macOS上,你可以用Homebrew安装这个工具:
brew install pipenv
就这样了。你就可以开始了!要在其他平台上安装它,请查看pipenv文档中的这一部分。
创建虚拟环境
现在,让我们看看如何为一个 Python 项目创建一个虚拟环境。首先,转到项目文件夹:
cd ~/path/to/the/project/folder
然后执行:
pipenv install
这将创建一个虚拟环境和:
- 如果你已经有一个Pipfile和一个Pipfile.lock:它也会在上面安装所有指定的软件包。
- 如果你没有Pipfile和Pipfile.lock:它将为该环境生成它们。
这就是最近创建的Pipfile的模样:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "3.7"
在[packages] 部分,你将看到已安装的执行包 - 你的 Python 程序需要正确执行的那些包。
在[dev-packages] 部分,你将看到仅在开发中需要的软件包。另外,在这个例子中,你可以看到使用的 Python 版本是3.7 。
如果你使用 Pyenv,pipenv install 命令将使用你系统的全局 Python 版本。但正如你所知,你可以在你的项目中指定一个本地的 Python 版本。比如说:
pyenv local 3.8.8
而且,如果你想使用那个本地的 Python 版本,你可以通过执行来向 Pipenv 指示:
pipenv install --python 3.8.
现在,如果你想删除已经创建的虚拟环境来创建另一个,该怎么办?你可以通过运行来实现:
pipenv --rm
另一件需要记住的重要事情是激活所创建的虚拟环境,你可以通过运行:来完成。
pipenv shell
通过这个命令,你 "进入 "了你的虚拟环境。在你的终端,你可以看到你是否已经激活了虚拟环境,如果你看到行首的括号中的名称,如下所示:
在这里你可以看到,在pipenv shell 命令被执行后,虚拟环境的名称出现在行首的括号中。要停用该虚拟环境,只需运行。
exit
管理软件包
好了,现在你知道如何创建、删除、激活和停用一个虚拟环境了。现在让我们来看看如何管理其中的包。首先,别忘了激活虚拟环境。要安装一个包,例如django-drip-campaings,你可以执行:
pipenv install django-drip-campaigns
这个命令会:
- 安装该软件包的最新可用版本。
- 自动更新添加该软件包的Pipfile文件。
- 自动更新Pipfile.lock文件,添加软件包的版本和其他一些重要的元数据。
现在Pipfile文件看起来像这样:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
django-drip-campaigns = "*"
[dev-packages]
[requires]
python_version = "3.8"
正如你所看到的,该软件包被安装在[packages] 部分。如前所述,在[dev-packages] 部分,你只安装部署所需的东西。
例如,你想在你的项目中安装flake8,这只是开发过程中的需要。要在[dev-packages] 部分中安装它,请执行:
pipenv install flake8 --dev
之后,你会在Pipfile文件中看到类似这样的东西:
[packages]
django-drip-campaigns = "*"
[dev-packages]
flake8 = "*"
另外,如果你需要一个特定版本的软件包怎么办?比如说--Django,不是最新的,而是2.2版本。然后运行:
pipenv install django==2.2
现在Pipfile已经更新了,将类似于:
[packages]
django-drip-campaigns = "*"
django = "==2.2"
[dev-packages]
flake8 = "*"
在Django 包行中,你不会看到 "*",而是看到命令中指出的特定版本。如果你需要卸载一个软件包,例如django-drip-campaigns ,只要运行:
pipenv uninstall django-drip-campaigns
该命令将卸载该软件包,并删除Pipfile和Pipfile.lock文件中的信息。现在假设你的项目中需要最新版本的Django (不是2.2版本)。要将一个软件包更新到最新版本,你必须:
- 将Pipfile中的
django = "==2.2"行改为django = "*"。 - 然后运行。
pipenv update django
或者,你可以卸载Django ,然后重新安装,不指定版本。你可以重复这些步骤来降级一个软件包的版本,而不是升级它。
你可以用Pipenv做很多事情,但前面提到的贯穿始终的是主要功能。很简单,对吗?现在让我们来看看Pipenv提供的上述命令的总结:
pipenv install创建一个虚拟环境。pipenv install --python <Python version>创建一个显示所需Python版本的虚拟环境(你已经用Pyenv安装了)。pipenv --rm删除当前的虚拟环境。pipenv shell激活创建的虚拟环境。exit停用一个已经激活的虚拟环境。
现在让我们看看虚拟环境被激活后的命令摘要:
pipenv install <package name>在[packages]部分安装最新版本的软件包。pipenv install <package name>==<package version>安装一个指定版本的软件包,在[packages]部分。pipenv update package更新一个版本的软件包(更新或降级)到你之前在Pipfile中指定的版本。- 在前面的命令中加入
--dev,Pipenv将做同样的事情,但在[dev-packages]部分。 pipenv uninstall <package name>卸载一个软件包。
总结
正如在整个过程中所强调的,我已经介绍了两种不同的工具,用于使用虚拟环境管理 Python 项目。有很多方法可以做到这一点,但我展示了我认为最有效的两种。
作为工具,Pyenv和Pipenv是整洁的,可维护的,并且易于理解和使用。Pyenv用于管理不同的Python版本,而Pipenv则用于管理Python包。
我非常喜欢使用这两个工具,我希望你能受到鼓励,尝试一下这些用于Python开发的工具。谢谢您的阅读,请继续关注更多有用的内容。