当你使用Python来编写程序时,经常会用到别人研发好的库。通常,这些库会由各自的研发人员上传到某个远端服务上,比如PyPi,然后,你作为使用者,则只需要借助pip,就可以将需要用到的库从远端服务拉取到本地计算机(如下图所示)。研发人员将三方库研发出来(图中左边部分),打包分发到Package Index,然后,你会从Package Index拿到三方库(图中右边部分)。其中Package Index是Python官方的包存储服务,全世界的研发者都可以访问,这个服务的背后实际上运行了大量的服务器。除了通过Package Index服务获取三方库之外,你也可以直接下载三方库的安装包(后缀名通常是.whl),然后通过pip install <your-package-name>.whl
来安装三方库。
在以后的日子里,你会经常使用pip来安装和卸载各种第三方库,因此,为了让你更加自信地使用pip,这篇文章将从以下几个方面来讲述pip:
pip是Python官方提供的包管理工具,有了它,Python研发人员就可以轻松安装或卸载其他研发人员提供的Python库。包管理工具这个概念被广泛运用在各大编程语言和操作系统,比如:C#使用Nuget来管理第三方库、Ruby使用gem来管理三方库、Node.js使用npm来管理三方库;再比如:Ubuntu操作系统使用apt来管理三方库,而Redhat则使用yum来管理三方库。总之,通过pip,你只需要提供需要用到的三方库名字,就能将指定的三方库安装到本地计算机上。
为了使用pip,你首先需要安装它。一般,如果你使用的是Window或者是Mac操作系统,那么当你安装Python的时候,pip也会随之安装,安装好之后,你只需要执行以下命令,就可以确定pip安装成功:
% pip3 --version
执行完以上命令之后,会得到以下结果:
pip 20.1.1 from /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip (python 3.8)
以上结果说明,我的pip版本是20.1.1。有了以上概念且成功安装上pip之后,接下来,让我们看看如何使用pip来安装requests库。
requests库是由其他开发者研发的三方库,它的源代码在这里,但是,我们一般会直接看它的官方使用文档。简单来说,requests是一个关于网络请求的三方库,它能够提供友好的程序接口来收发HTTP请求,关于HTTP请求的相关内容,你可以参考这篇文章。
通常,你只需要执行以下指令,就能轻松地将requests库安装到你本地计算机:
pip3 install requests
以上指令会到PyPi上获取最新的requests库,然后将其安装到你的本地计算机。安装成功之后,你可以执行以下指令来查看你的本地计算机都安装了哪些三方库:
pip3 list
输出结果:
Package Version
------------------------------------------------- ---------
alipay-sdk-python 3.3.398
ansible 4.5.0
...
readme-renderer 27.0
requests 2.24.0
xlrd 2.0.1
XlsxWriter 1.3.7
youtube-dl 2021.4.26
你可以看到,我的电脑上已经安装了requests库,而且它的版本号是2.24.0。当然,你也可以执行以下指令,单独显示requests的信息:
pip3 show requests
输出结果,如下所示:
Name: requests
Version: 2.24.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
Requires: certifi, urllib3, idna, chardet
Required-by: twine, requests-toolbelt
输出结果不仅包含了它的版本号,而且还包含了其它信息,其中,Requires和Required-by两处信息分别告诉你requests依赖于哪些库(certifi, urllib3, idna, chardet),以及哪些库(twine, requests-toolbelt)依赖于requests。当你要卸载requests库的时候,这2处信息会用到。因此,当你安装requests的时候,其它库certifi、urllib3、idna、chardet也会被安装,因为requests依赖它们。
现在,你已经安装了requests库,那么让我们看看如何使用它。打开命令行,输入以下指令并回车进入可交互的Python解释器:
python3
首先,输入以下指令,导入requests库:
import requests
关于import的知识,你可以参考这篇文章。接下来,你可以通过以下指令来获取digolds.cn页面:
requests.get('https://digolds.cn')
到目前为止,你已经学习了如何使用pip来安装三方库了,你也可以使用同样的方式来安装其它库。比如:你可以使用以下指令来依次安装多个三方库:
pip3 install digwebs requests
对于依赖三方库较少的项目,以上做法是没问题的,但是,如果你编写的Python程序依赖10几个三方库时,那么,以上方法就会让你失去效率,而且,当你依赖某个特定版本的三方库时,以上方式也非常容易出错。那么为了解决依赖多个三方库以及特定版本的问题,pip引入了requirements概念。接下来,让我们看看它是如何解决上述问题的。
pip允许你将依赖的三方库和它的版本写到文件里,通常这个文件就是requirements.txt,它的格式如下所示:
alipay-sdk-python==3.3.398
ansible==4.5.0
pytz==2020.5
PyYAML==5.4.1
readme-renderer==27.0
requests==2.24.0
requests-toolbelt==0.9.1
resolvelib==0.5.4
==号左边是三方库的名字,右边则是版本号。为了安装requirements.txt中指定的三方库以及对应的版本,你需要执行以下指令:
pip3 install -r requirements.txt
执行之后,pip会依次安装每一行指定的三方库以及对应的版本,比如:pip遇到requests==2.24.0这一行时,它会安装版本为2.24.0的requests库。如果,你的项目严格依赖某个特定版本的三方库,那么这种方法没有什么问题,但是如果requests更新到了版本3.0.0,那么以上方法就无法使用3.0.0版本的requests库了。为了解决这个问题,你可以在requirements.txt里把==号修改成>=,如下所示:
requests>=2.24.0
当你使用pip3 install -r requirements.txt
时,如果requests的最新版本号是2.27.1,那么该指令执行之后,你的计算机就会装上版本号为2.27.1的requests库。
如果,你之前就已经装过requests库,而且想升级到最新的版本,那么你需要执行以下指令:
pip3 install -U -r requirements.txt
其中U是upgrade的缩写。以上就是requirments.txt文件在pip中的作用,在日常的项目中,你可以创建两个requirement文件,一个是requirements.txt文件,另外一个是requirementsdev.txt文件,前者包含了生产环境所依赖的库,而后者会引入requirements.txt文件同时会包含研发环境所依赖的库,比如测试库,requirementsdev.txt的内容如下所示:
-r requirements.txt
pytest>=7.1.1
如果你在研发环境中执行以下指令:
pip3 install -r requirements_dev.txt
那么pip不仅会安装requirements.txt中指定的库,而且也会把pytest安装到本地计算机。通过这2个文件,就可以将研发环境和生产环境所依赖的库分开。
有时,你想发现有更好的三方库可以替代requests,或者你不再使用requests库了,那么你需要卸载requests库。为了卸载三方库,首先,你需要查看它依赖于哪些库(Requires),以及被哪些库(Required-by)引用。执行以下指令:
pip3 show requests
你会得到以下输出结果:
Name: requests
Version: 2.27.1
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Users/slz/dev/testenv/lib/python3.8/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by:
通过Requires,你可以看到requests依赖certifi, charset-normalizer, idna, urllib3,因此,你应该优先卸载这些依赖库,然后再卸载requests。 通过Required-by,你可以看到没有其它三方库依赖requests,因此,如果你卸载requests,那么不会影响其它Python程序的运行。
到目前为止,你已经学习了pip的基本概念,以及如何使用pip安装和卸载第三方库。除此之外,你应该要掌握如何使用requirements.txt文件来管理大量第三方库,以及如何使用它来区分研发环境和生产环境。
虽然,你可以使用以上方法来安装和卸载第三方库,但是,目前它有一个缺陷:你会把三方库安装在系统级别,供所有人使用。这种安装方式存在以下问题:
为了解决以上问题,我们需要在一个独立的环境里使用pip,也就是下一篇文章要介绍的Virtual Environments。我们只需要创建一个独立的环境,然后切换到这个独立的环境里,就可以随意使用本篇文章所介绍的pip知识,而不用担心会破坏其它Python程序所依赖的三方库。
{{ c.user.name }}
{{ c.content }}