如何用Pipenv和Pyenv管理你的Python项目

855 阅读9分钟

在隔离环境中分离项目的依赖关系时,Python 虚拟环境是开发者的一个重要工具。如果在本地进行几个 Python 项目的工作,开发者可能需要在每个项目上使用不同的 Python 版本。

通过这样做,他们将能够安装不同的包,并为每个环境拥有不同版本的命名包。

然而,这可能会产生很多兼容性问题,除非你使用虚拟环境正确地管理它们。有很多方法可以做到这一点,我将强调两个工具:PyenvPipenv

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

这将创建一个虚拟环境和:

  1. 如果你已经有一个Pipfile和一个Pipfile.lock:它也会在上面安装所有指定的软件包。
  2. 如果你没有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版本)。要将一个软件包更新到最新版本,你必须:

  1. 将Pipfile中的django = "==2.2" 行改为django = "*"
  2. 然后运行。
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开发的工具。谢谢您的阅读,请继续关注更多有用的内容。