简介
Kenneth Reitz的最新工具Pipenv可以用于简化Python项目中依赖项的管理。只用了一年, Pipenv 就变成了管理软件包依赖关系的 Python 官方推荐资源。 它汇集了Pip,Pipfile和Virtualenv的功能,是一个强大的命令行工具。
Python 包安装简史
为了理解 Pipenv 所解决的问题,看一看 Python 包管理如何发展十分有用的。
让我们回到第一个 Python 版本,这时我们有了 Python,但是没有干净的方法来安装软件包。
然后有了 Easy Install,这是一个可以相对容易地安装其他 Python 包的软件包,但它也带来了一个问题:卸载不需要的包并不容易。
pip 登场,绝大多数 Python 用户都熟悉它。pip 可以让我们安装和卸载包。我们可以指定版本,运行 pip freeze > requirements.txt
来输出一个已安装包列表到一个文本文件,还可以用相同的文本文件配合pip install -r requirements.txt
来安装一个应用程序需要的所有包。
但是 pip 并没有包含将软件包彼此隔离的方法。我们可能会开发使用相同库的不同版本的应用程序,因此我们需要一种方法来实现这一点。随之而来的是虚拟环境,它使我们能够为我们开发的每个应用程序创建一个小型的、隔离的环境。我们已经看到了许多管理虚拟环境的工具:virtualenv
、 venv
、 virtualenvwrapper
、pyenv
、 pyenv-virtualenv
、 pyenv-virtualenvwrapper
等等。它们都可以很好地使用 pip
和 requirements.txt
文件。
新方法: pipenv
Pipenv 旨在解决几个问题:
首先,需要 pip 库来安装包,外加一个用于创建虚拟环境的库,以及用于管理虚拟环境的库,再有与这些库相关的所有命令。这些都需要管理。Pipenv 附带包管理和虚拟环境支持,因此你可以使用一个工具来安装、卸载、跟踪和记录依赖性,并创建、使用和组织你的虚拟环境。当你使用它启动一个项目时,如果你还没有使用虚拟环境的话,Pipenv 将自动为该项目创建一个虚拟环境。
Pipenv 通过放弃 requirements.txt
规范转而将其移动到一个名为 Pipfile
的新文档中来完成这种依赖管理。当你使用 Pipenv 安装一个库时,项目的 Pipfile
会自动更新安装细节,包括版本信息,还有可能的 Git 仓库位置、文件路径和其他信息。
其次,Pipenv 希望能更容易地管理复杂的相互依赖关系。你的应用程序可能依赖于某个特定版本的库,而那个库可能依赖于另一个特定版本的库,这些依赖关系如海龟般堆叠起来。当你的应用程序使用的两个库有冲突的依赖关系时,你的情况会变得很艰难。Pipenv 希望通过在一个名为 Pipfile.lock
的文件中跟踪应用程序相互依赖关系树来减轻这种痛苦。Pipfile.lock
还会验证生产中是否使用了正确版本的依赖关系。
另外,当多个开发人员在开发一个项目时,Pipenv 很方便。通过 pip 工作流,凯西可能会安装一个库,并花两天时间使用该库实现一个新功能。当凯西提交更改时,他可能会忘记运行 pip freeze
来更新 requirements.txt
文件。第二天,杰米拉取凯西的改变,测试就突然失败了。这样会花费好一会儿才能意识到问题是在 requirements.txt
文件中缺少相关库,而杰米尚未在虚拟环境中安装这些文件。
因为 Pipenv 会在安装时自动记录依赖性,如果杰米和凯西使用了 Pipenv,Pipfile 会自动更新并包含在凯西的提交中。这样杰米和凯西就可以节省时间并更快地运送他们的产品。
最后,将 Pipenv 推荐给在你项目上工作的其他人,因为它使用标准化的方式来安装项目依赖项和开发和测试的需求。使用 pip 工作流和 requirements.txt
文件意味着你可能只有一个 requirements.txt
文件,或针对不同环境的多个 requirements.txt
文件。例如,你的同事可能不清楚他们是否应该在他们的笔记本电脑上运行项目时是运行 dev.txt
还是local.txt
。当两个相似的 requirements.txt
文件彼此不同步时它也会造成混淆:local.txt
是否过时了,还是真的应该与 dev.txt
不同?多个 requirements.txt
文件需要更多的上下文和文档,以使其他人能够按照预期正确安装依赖关系。这个工作流程有可能会混淆同时并增加你的维护负担。
入门
- 使用
pip
安装pipenv
及其依赖项
pip install pipenv
- 然后将目录更改为包含你的Python Project的文件夹, 并启动pipenv
cd my_project
pipenv install
# output
Creating a virtualenv for this project…
Pipfile: C:\Users\east4ming\WorkSpace\python\my_project\Pipfile
Using c:\users\east4ming\appdata\local\programs\python\python35\python.exe (3.5.2) to create virtualenv…
[ ] Creating virtual environment...Already using interpreter c:\users\eatst4ming\appdata\local\programs\python\python35\python.exe
Using base prefix 'c:\\users\\east4ming\\appdata\\local\\programs\\python\\python35'
New python executable in C:\Users\east4ming\.virtualenvs\my_project-9dJMlns3\Scripts\python.exe
Installing setuptools, pip, wheel...
done.
Successfully created virtual environment!
Virtualenv location: C:\Users\east4ming\.virtualenvs\my_project-9dJMlns3
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (a79791)!
Installing dependencies from Pipfile.lock (a79791)…
================================ 0/0 - 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
这将在项目目录中创建两个新文件Pipfile和Pipfile.lock,如果项目不存在,则为项目创建一个新的虚拟环境。 如果你添加–two
或–three
标志到上面的最后一个命令,它分别使用Python 2或3来初始化你的项目。 否则将使用默认版本的Python。
管理Python依赖关系
Pipfile包含关于项目的依赖包的信息,并取代通常在Python项目中使用的requirements.txt文件。 如果你在具有requirements.txt文件的项目中启动了Pipenv,则在把它从项目中删除之前,应该使用Pipenv安装该文件中列出的所有依赖包。
要为你的项目安装Python包,请使用install关键字。 例如,pipenv install beautifulsoup4
将安装当前版本的Beautiful Soup包。 可以使用uninstall关键字以类似的方式删除包,pipenv uninstall beautifulsoup4
可以通过更新Pipfile.lock来冻结软件包名称及其版本,以及其依赖关系的列表。 这可以使用lock关键字完成的,pipenv lock
如果另一个用户克隆存储库,可以添加Pipfiles到你的Git存储库,这样他们只需要在他们的系统中安装Pipenv,然后键入,pipenv install
Pipenv会自动找到Pipfiles,创建一个新的虚拟环境并安装必要的软件包。
管理你的开发环境
通常有一些Python包只在你的开发环境中需要,而不是在你的生产环境中,例如单元测试包。 Pipenv将使用–dev
标志保持两个环境分开:pipenv install --dev nose2
这个命令安装了nose2,但也将其关联为只在开发环境中需要的软件包。 这很有用,因为现在,如果你要在你的生产环境中安装你的项目,pipenv install
默认情况下不会安装nose2包。 但是,如果另一个开发人员将你的项目克隆到自己的开发环境中,他们可以使用–dev
标志,pipenv install –dev
并安装所有依赖项,包括开发包。
使用 Pipenv 还有其他好处:它具有更好的安全特性,以易于理解的格式绘制你的依赖关系,无缝处理.env
文件,并且可以在一个文件中自动处理开发与生产环境的不同依赖关系。
运行你的代码
为了激活与你的Python项目相关联的虚拟环境,你可以使用简单地shell命令,比如: pipenv run which python
将在你的虚拟环境中运行which python
命令(linux shell的命令),并显示与你的虚拟环境相关联的python可执行文件所在的路径。
这是在虚拟环境中运行你自己的Python代码的一个简单方法,pipenv run python my_project.py
启动一个shell, 运行pipenv shell
如果你想将当前使用 requirements.txt
文件的项目转换为使用 Pipenv,请安装 Pipenv 并运行:pipenv install requirements.txt
这将创建一个 Pipfile 并安装指定的 requirements.txt。考虑一下升级你的项目!