什么是 pip ?pip 是 Python 中的标准库管理器。它容许你安装和管理不属于 Python标准库 的其它软件包。本教程就是为 Python 新手介绍 pip。
html
经过本教程,你将学到:python
1. 安装 Python 的标准发行版中未包含的其余软件包web
2. 查找发布于 Python 包索引(PyPI)的包npm
3. 管理脚本和应用程序的安装需求django
4. 卸载包及它的相关依赖安全
如你所见,Python 社区很是活跃,而且为 pip 建立了一些简洁的替代方案,你能够在本教程稍后的部分看到。服务器
那么,什么是 pip 呢?pip 是 Python 的包管理器。这意味着它是一个工具,容许你安装和管理不属于标准库的其余库和依赖。框架
软件包管理极其重要,因此自 Python3 的 3.4 版本以及 Python2 的 2.7.9 版本开始,pip 一直被直接包括在 Python 的安装包内,一样还被用于 Python 的其它项目中,这使得 pip 成为了每个 Pythonista(Python用户)必备的工具。机器学习
若是你已经了解了其余语言,那么可能会对包管理器的概念比较熟悉。JavaScript 使用 npm 管理软件包,Ruby 使用 gem,以及 .NET 使用 NuGet。Python 中,则是 pip 做为标准包管理器。编辑器
Python 的安装器中自带了 pip,因此你能够直接使用它,除非你安装的是更早版本的 Python。你能够经过在控制台中运行如下命令来验证 pip 是否可用:
你应该能够看到一个相似的输出,显示 pip 的版本以及安装位置还有 Python 的版本。若是你使用的是不包含 pip 的旧版本 Python,你能够根据 pip 安装文档中相应系统的说明进行安装。
你可能但愿在虚拟环境中使用本教程的示例,以免将包安装到 Python 的全局安装环境中。你能够从 Python 虚拟环境:入门级了解虚拟环境相关的信息,这篇文章的”使用虚拟环境“一节介绍了建立虚拟环境的基础知识。
Python 被认为是一种"内置电池"式的语言。这表示 Python 标准库包含大量的软件包和模块,这些模块有助于开发人员开发脚本和应用。
与此同时,Python 拥有一个活跃的社区,它提供了一个更大的软件包集合,以供你开发所需。这些软件包发布在 Python Package Index,也被称为 PyPI(发音 Pie Pea Eye)。PyPI 托管了大量包,包括开发框架,工具和库。
其中不少软件包经过为已有功能提供了友好地接口来简化 Python 开发。例如,你能够写一个脚本,仅使用 Python 标准库中的功能分析网页的内容:
脚本中,导入了 cgi 和 http.client,这两个都是在 Python 的标准库中。你建立了一个 HTTPSConnection 对象并指定服务器,而后调用 .request() 和 .getresponse() 解析响应信息。
从响应信息中,咱们解析到 Content-Type 头信息而且使用 cgi 模块提取页面编码的字符集。
cgi.parse_header() 返回一个包括主要值和字典做为参数的元组。例如,Content-Type 头信息可能包含一个像 text/html; charset=ISO-8859-1 的值。
这个元组将字符串 text/html 做为第一个元素,第二个元素是 {'charset': 'ISO-8859-1'} 这样形式的字典。由于你只须要关心 charset 参数,可使用下划线忽略元组的开头:_, params = cgi.parse_header(content_type)。
注意:Python 中下划线的含义解释了如何从元组解包值。
对页面编码后,你能够阅读相应信息并解码到文本中。你能够在控制台中运行这个例子查看它是怎么工做的:
对于一个用于解析网页内容的小脚原本说,这看起来作的工做有点多。幸运的是,有一个 Python 的包能够简化 HTTP 请求并提供了一个友好地接口来实现你的指望。
PyPI 托管了一个很是流行的库 requests 来完成 HTTP 请求。你能够经过它的官方文档站点了解全部的相关信息。
第一步是在你的环境中安装 requests 包。你能够运行 pip help 来了解 pip 支持的命令:
如你所见,pip 提供了 install 命令来安装软件包。你能够运行它来安装 requests 包:
你能够看到与上面相似的输出信息。你可使用 pip 以及 install 命令,其后跟着你想要安装的包名。pip 会在 PyPI 中查找这个包,计算其依赖关系,安装并确保 requests 正常工做。
你还能够看到当前环境下 pip 的版本是 18.1,可是还有 19.0.1 版本可用。它还显示了用于升级 pip 的命令,因此咱们来试一下:
注意这里,你使用了 python -m 来升级 pip。-m 开关告诉 Python 将模块做为可执行文件运行。若是你要升级 pip,这么作是颇有必要的,在安装新的版本以前会卸载旧的版本,而当工具在运行时卸载它本身会致使错误。
当你将 pip 做为一个模块运行时,Python 会将模块加载到内存中,并容许在这个模块包运行的时候删除它。若是软件包提供了顶层脚本 __main__.py,那么你能够像运行脚本一下运行这个软件包。
你已经安装了 requests 并升级了 pip,如今可使用 list 命令查看你的环境中安装了哪些软件包。
如上所示,pip 已经升级到了 19.0.1 版本(目前最新版本),而且安装了 requests 2.21.0 版本。
命令 pip install 会查找并安装软件包的最新版本。同时还会搜索软件包元数据中的依赖列表,并安装这些依赖以确保软件包知足全部的需求。
这里你能够看到安装了不少软件。你可使用 pip 中的 show 命令查看包的元数据信息:
元数据中列出了依赖项 certifi,chardet,idna 和 urllib3,并且你能够看到这些都已经安装好了。
既然已经安装了 requests 包,咱们能够修改上面的例子,来看看如何更方便地解析网页的内容:
由于你已经在开发环境中安装了 requests 包,能够像导入其余标准库同样导入它。
能够看到,requests.get() 处理了 HTTP 链接并返回一个与以前例子类似的响应,可是简洁方便了不少。
由于 requests 已经帮你处理了大部分状况,因此你不须要考虑页面的编码问题。并且,requests 还经过 requests.Response 对象提供了一个更加灵活的接口来处理特殊状况。
pip install 命令只会安装最新发布的软件包版本,可是有时候,你可能但愿根据代码运行状况安装特定的版本。
你还但愿在开发和测试时指定建立的依赖和版本,这样就能够在生产环境避免应用程序出现意外状况。
需求文件能够精确指定须要安装的软件包和版本。运行 pip help 你能够看到一个 freeze 命令,它会按照格式化输出以已经安装的软件包。你可使用这个命令,将输出重定向到文件以生成一个需求文件:
freeze 命令将全部软件包以及版本信息转储到标准输出,因此你能够重定向这些输出到文件中。这样就能够在其余系统中根据这个需求文件执行精准安装。约定这个需求文件名为 requirements.txt,可是你也能够根据我的喜爱命名。
若是你但愿在其余系统中复制你的开发环境,你能够运行 pip install 命令并用 -r 开关指定需求文件:
软件包的版本会根据 requirements.txt 所列出的进行匹配:
你能够将 requirements.txt 文件提交到资源控制器,这样就可使用它在其它机器上建立精准匹配的环境了。
软件包及其依赖的版本可能会致使硬编码问题,这是由于软件包会针对 bug 以及安全修复进行频繁的更新,而你可能但愿在它们发布后当即作出更改。
需求文件的格式容许你使用逻辑运算符指定依赖的版本,这为确保更新包提供了更多的灵活性,可是仍然要定义一个包的基础版本。
使用你经常使用的编辑器并做如下修改:
你能够经过改变逻辑运算符为 >= 来告知 pip 精准安装已发布的指定版本或更高版本。当你使用 requirments.txt 设置了一个新的环境,pip 会查找知足需求的最新版本并安装。你可使用带有 --upgrade 开关的 install 命令来升级你需求文件中定义的软件包:
这里没有任何升级操做,由于你的软件都是最新版本,可是若是在包列表中发布了新的版本,那么这个包就会被升级到最新版本。
理想状况下,新版本的包会向后兼容而且没有新引入的 bug。不幸的是,新版本引入的更改仍是可能会破坏你的应用程序。需求文件的语法支持额外的版本说明符来微调你的需求。
比方说 requests 发布了新版本 3.0,可是有一些更改与你的应用程序不兼容。你能够经过修改需求文件来禁止安装 3.0 版本以及更高的版本:
更改 requests 的版本操做符能够确保不会安装 3.0 或更高的版本。pip 的文档提供了所有的需求文件格式,你能够查阅以了解更多相关信息。
你在开发期间安装的依赖并不都是你的应用程序的依赖。其中有不少发布到 PyPI 上的包,是你开发过程当中想用到的工具或库。
比方说,你可能但愿对你的应用作单元测试,你须要单元测试的框架。一个流行的单元测试框架是pytest。你但愿在你的开发环境中安装它,可是却不但愿在生产环境也安装它,由于它不是应用的依赖。
这时你会建立第二个需求文件(requirements_dev.txt)来列出配置开发环境须要的工具:
这里须要你使用 pip 安装两个需求文件:requirements.txt 和 requirements_dev.txt。还好,pip 容许在需求文件内部指定一些额外的参数。你能够需改 requirements_dev.txt 文件支持同时安装生产文件 requirements.txt 中的需求:
注意这里你使用了彻底相同的 -r 开关来安装生产文件 requirements.txt。需求文件格式容许你在需求文件中指定其余参数。
你已经建立了生产和开发环境的需求文件,并将它们添加到资源控制器中。这些文件能够灵活 的指定版本,能够经过发布的依赖进行修复 bug。你还能够测试你的应用程序并为发布到生产环境作准备。
由于已经知道开发环境应用程序的全部测试已经正常经过,因此你可能但愿确保生产环境的依赖版本与整合管道或构建过程当中使用的彻底相同。
目前的版本说明符并不能保证会在生产环境部署彻底相同的版本,因此你须要冻结说明文件 ,像以前看到的那样。
你建立了一个干净的生产环境,并使用 requirements.txt 文件安装了生产需求。安装完需求文件以后,你能够冻结当前这个特定的版本,并将输出转储到生产环境的 requirements_lock.txt 文件中。该 requirements_lock.txt 文件中包含精确的版本说明符,而且能够复制当前环境。
当你拥有更多的 Python 经验以后,会有一套熟悉的软件包,而且能够用于大部分应用程序。包 requesta 与 pytest 对于补充你的 Python 工具箱来讲,都是很好的选择。
有时你须要解决不一样的问题,并想要找到一个能够帮助你解决问题的工具或库。上面提到,命令 pip help 展现了一个命令 search,能够搜索在 PyPI 上发布包。
咱们看看这个命令有什么用:
这个命令给出了一组选项以及一个 参数。query 是一个用于搜索的字符串,能够匹配包名及描述。
注意:你可使用 pip help 检索其它支持的命令的信息。
假设你的应用须要访问一个使用 OAuth2 受权的服务。理想状况下,会有一个库使用 requests 执行或者其它相似的接口实现。用 pip 到 PyPI 上搜索一下:
search 命令选项生成了一个至关大的包集合。其中一些看起来像 django-oauth 这样指定了一个服务或技术。但愿找到一个像是 requests-oauth 的信息。很不幸,除了简短的描述,并无其它信息。
多数状况下,你但愿直接在 PyPI 的网站搜索包。PyPI 为其索引提供了搜索功能,并经过包中公开的元数据(如框架,主题,开发状态等)过滤搜索结果。
PyPI 中用同一个术语搜索可能会产生大量的结果,不过你能够对它们进行分类过滤。好比,若是你想要找到能够帮助你开发应用的库,你能够展开 Intended Audience 并选择 Developers。另外,你可能还须要一个稳定且可用于生产的包,能够展开 Development Status 并选择 Production/Stable。
你能够应用其余过滤器以及调整搜索词,直到找到你想要的包。
搜索结果提供了一个包页面的连接,包含了更多的信息以及想要的文档。下面咱们看看 requests-oauth2 的信息:
这个项目页面提供了更多的信息,并且看起来还有一个指向 Home 页的连接。该连接指向 Github 上的项目仓库。你能够看到项目相关的更多信息以及一些使用示例。
看到初始源代码仓库,像是找到了无价的财富。在那里,你能够经过查看最新的提交日志,PR(pull request)次数以及打开的 issues 等问题来找到一些项目的状态和提示。
另外还有一个查找包的方式,Google。被普遍使用的 Python 库会展现在 google 搜索的顶部,而且你应该能看到指向 PyPI 中包或者源代码仓库的连接。
找到一个合适包须要花费一些时间研究,可是只要找到了,就能够为你的开发过程提速。
有时候你不得不卸载一个软件包。要么是你找到了一个更好的包来替代它,要么是确实不须要某些功能了。卸载软件包会有一些棘手。
注意这里,当你安装了 requests,pip 同时也安装了其余的依赖。你安装的包越多,多个包拥有相同的依赖的可能性越大。这里 pip 的 show 命令就派上用场了。
卸载包以前,先确保你已经对这个包运行了 show 命令:
注意最后的两个属性 Requires 和 Required-by。show 命令向咱们展现了 requests 须要依赖 urllib3,certifi,chardet 和 idna。你可能但愿卸载其中的两个。并且你能够看到 requests 没有被其余包引用,因此它能够安全地卸载。
你应该对 requests 中全部的依赖都运行一下 show 命令,以确保没有其余库依赖它们。你了解了这些依赖次序以后,就可使用 uninstall 命令来卸载它们。
卸载包会显示将要删除的文件并要求确认。若是你确认要卸载这个包而且已经检查了它的依赖关系,知道没有其余包在使用这个包,那么可使用 -y 开关来隐藏文件列表和确认提示信息:
你能够一次调用指定全部你想卸载的包:
你还能够经过提供 -r 选项来删除需求文件中列出的所有软件包。这个命令会对每个包都提示确认信息,若是你已经明确知晓你的操做,能够经过 -y 开关禁止这些提示:
在你想要卸载包时,一直都要记得检查一遍依赖项。你可能但愿卸载一个软件包的全部依赖,不过若是有其它软件包在使用这些依赖,会致使程序崩溃。
pip 是全部 Pythonista 必备的基本工具,不少应用程序和项目使用它做为软件包管理器。本教程帮助你了解基础知识,而 Python 社区很是积极的为其它开发人员提供了很棒的工具和库。其中包括 pip 的替代品,指望实现简单高效的包管理。
在本节,你将了解到 Python 中其它可用的包管理工具。
Conda 是一个包括 Python 在内的多种语言的包、依赖及环境管理器。实际上,它最先来源于Anaconda,做为 Python 中研究数据科学的包出现。
Conda 普遍用于数据科学和机器学习应用程序,并使用本身的索引来托管兼容的软件包。
Conda 不只能够管理包的依赖项,还能够管理应用的虚拟环境,安装兼容并存的 Python 版本,为生产部署打包应用。
在 Windows 系统上为机器学习设置 Python 很好的介绍了 Conda,它探讨了包和环境管理。惟一与 Windows 相关的特定信息是安装,所以若是你使用的是其余系统平台,它仍然是可信的。
Pipenv 是另一种包管理工具,旨在为 Python “提供全世界最好的包”。因为将虚拟环境与包管理合并到一个工具中,pipenv 在 Python 社区得到了极大的关注。
它还解决了在使用 pip 手动管理依赖关系是遇到的一些常见问题,好比,包的版本,隔离开发与生产环境依赖,锁定生产环境版本等。
Pipenv:新的 Python 打包工具指南是一份很好的学习 Pipenv 及其包管理的入门材料。尽管这篇文章的标签是中级,可是做者对读者作了很好的引导,初学 Python 的人也能理解这篇文章。
Poetry 是另外一个受到大量关注的 pip 替代品。与 Pipenv 相似,它简化了包的版本管理并隔离了开发环境与生产环境的依赖,并且它将依赖隔离到一个虚拟环境中运行。
若是你已经了解 JavaScript 和 npm,会以为 Poetry 很是熟悉。它不仅是管理包,还能够帮助你为应用和库构建发行版本并部署到 PyPI。如何向 PyPI 发布一个开源的 Python 包中一个很棒的 Poetry 介绍能够帮你入门。
本教程回答了问题:什么是 pip?你如今已经知道,pip 是 Python 的包管理器,被不少项目用于依赖管理。如今 Python 安装器已经包含了 pip,使它成为全部的 Pythonista 都应当会用的基础工具。
Python 提供了一个适用于开发各类应用的标准库扩展,可是 Python 活跃的社区提供了更多的工具和库,能够加速 Python 应用开发。
这些工具和库都发布在 Python 包索引(PyPI)上,而且使用 pip 容许开发者在本身的环境中安装它们。
经过这篇教程,你能够学到:
1. 在命令行使用 pip 以及需求文件安装新的软件包
2. 管理依赖,隔离开发与生产环境,以及建立一个锁定的需求文件
3. 经过 pip 和 PyPI 查找包
4. 在卸载包以前评估包依赖,以及如何卸载包此外,你已经了解到保持依赖处于最新的重要性,并且,pip 的不少替代品能够帮你管理这些依赖。