{{ selected_gold.title }}

  • ¥ {{ selected_gold.original_price }}
  • ¥ {{ selected_gold.price }}
  • {{ selected_gold.number_of_order }} 人订阅
  • {{ selected_gold.total_likers_count }}
    由 {{ selected_gold.creator_name }} 编辑

    {{ title }}

    请登录购买({{ selected_gold.price }}元),即可解锁剩余教程
    点击购买

    • Air
    • 2022年4月13日

    Python的包管理工具pip

    当你使用Python来编写程序时,经常会用到别人研发好的库。通常,这些库会由各自的研发人员上传到某个远端服务上,比如PyPi,然后,你作为使用者,则只需要借助pip,就可以将需要用到的库从远端服务拉取到本地计算机(如下图所示)。研发人员将三方库研发出来(图中左边部分),打包分发到Package Index,然后,你会从Package Index拿到三方库(图中右边部分)。其中Package Index是Python官方的包存储服务,全世界的研发者都可以访问,这个服务的背后实际上运行了大量的服务器。除了通过Package Index服务获取三方库之外,你也可以直接下载三方库的安装包(后缀名通常是.whl),然后通过pip install <your-package-name>.whl来安装三方库。

    在以后的日子里,你会经常使用pip来安装和卸载各种第三方库,因此,为了让你更加自信地使用pip,这篇文章将从以下几个方面来讲述pip:

    • pip的基本概念
    • 使用pip来安装requests库
    • requirements.txt文件
    • 使用pip来卸载requests库

    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库。

    使用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概念。接下来,让我们看看它是如何解决上述问题的。

    requirements.txt文件

    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个文件,就可以将研发环境和生产环境所依赖的库分开。

    使用pip来卸载requests库

    有时,你想发现有更好的三方库可以替代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文件来管理大量第三方库,以及如何使用它来区分研发环境和生产环境。

    虽然,你可以使用以上方法来安装和卸载第三方库,但是,目前它有一个缺陷:你会把三方库安装在系统级别,供所有人使用。这种安装方式存在以下问题:

    1. 如果你的计算机上有另外一个项目,它依赖requests 2.24.0,然后,因为你新引入了另外一个项目,使用了requests 2.27.1,之前已经存在的requests 2.24.0被迫升级到requests 2.27.1,导致另外一个项目无法正常工作。
    2. 当你卸载requests时,那些使用requests的项目将无法正常工作。

    为了解决以上问题,我们需要在一个独立的环境里使用pip,也就是下一篇文章要介绍的Virtual Environments。我们只需要创建一个独立的环境,然后切换到这个独立的环境里,就可以随意使用本篇文章所介绍的pip知识,而不用担心会破坏其它Python程序所依赖的三方库。