今天聊下pip的各种花式用法,熟练使用pip可以更方便的管理Python第三方库。


pip是什么

不免俗套的要先介绍一下,pip是Python的第三方包(库)管理器,Python有内置的标准库,在你安装完Python后这些标准库都已默认安装好了,但是还有很多有用的Pyhon库不是内置安装的,我们叫这些库为第三方库,要通过pip来安装和管理第三方库,还会管理库之间的依赖(dependency)关系。


举例:

Python的默认网络请求库是urllib,在Python安装的时候就已经是自带的,我们叫着这种为内置库,或标准库。但是有更好用的网络请求库:requests,它需要额外安装,比如使用


pip install requests

命令来安装,这种需要额外安装的库就叫做第三方库。pip就是来安装和管理第三方库的。


下面说的软件包都指代第三方库。


题外话:

不是所有的第三方Python包都能通过pip来安装,只能是发布在pypi.org上面的才能通过pip安装。


说下 pip 使用入门指南_java


pypi又是什么?

pypi是一个仓库,上面存放了大量的Python第三方软件包,是由Python官方社区维护。只要遵守pypi的规则,所有开发者都可以把自己开发的Python软件包发布在pypi上,供其他人下载使用。


我们通过


pip install requests

命令安装requests库时,其实就是pip从pypi上面下载下来进行安装的。

刚才说了不是所有的Python第三方库都能用pip安装,只有发布在pypi上的才能用pip。 还有很多开发者只把自己的Python软件发布在github上的(有的在pypi和github上都会发布),这种就需要你在github上把源代码下载下来进行安装。


闲扯了下pip和pypi的关系,我们继续说pip的事情。


从Pyhon3.4以后pip都默认跟着Python一块安装的。你可以使用如下命令来检查pip是否安装和pip的版本号:


pip --version



因为我安装了多个Python版本,所以使用的pip3命令。

上面会显示你的pip版本号,19.0.3是最新的版本。


pip有哪些命令可以使用,可以使用


pip help


命令来查看:


说下 pip 使用入门指南_java_02


如上图有:

pip install 安装软件包

pip download 只下载软件包不安装

pip uninstall 卸载软件包

pip list 显示已安装了哪些软件包

pip search 在pypi上模糊搜索软件包等等...

下面就介绍几个常用的命令


用pip安装第三方包

上面已经举例子了,如果你知道具体软件包的名字,就直接使用


pip install 软件包名

进行安装,这样会安装该软件的最新版本。同时pip会计算该软件的依赖包,如果没有冲突,就会一并把该软件包的依赖包一起安装了。


什么是依赖?就是一个软件要依赖另一个软件的功能才能运行,必须要把相关的依赖包都安装了,才能愉快的使用。


我们拿安装requests库来举例。



安装requests时,会向pypi上去查找这个包,然后计算和安装依赖,可以看出requests还依赖chardet、idna、urllib3这些包,所以会一并安装。


pip镜像源安装软件包

在用pip install安装时,是直接下载pypi上的软件,各种原因我们访问国外网站有时比较慢,可能在安装时会很慢,甚至提示超时,安装失败。


所以国内有公司和大学就镜像了pypi,把上面的软件包都镜像到国内,通过他们的镜像源安装就会很快。


比较典型的镜像源有:

豆瓣:

http://pypi.douban.com/simple/

阿里云:

http://mirrors.aliyun.com/pypi/simple/

清华:

https://pypi.tuna.tsinghua.edu.cn/simple


比如使用清华大学镜像源安装就是:


pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 软件包名


镜像源没法实时做到更新pypi上的软件包,所以有些软件包的版本可能不是最新的。


pip升级软件包

上面提到了软件包不是最新的,就说下用pip怎么升级软件包。


pip install upgrade 软件包名

为什么要升级软件包呢?通常最新版本的软件在性能和功能上都更完善,还可能会解决一些老版本的bug问题。


升级软件有什么坏处呢?新版本软件接口可能会发生变化,或者包依赖关系变动太大,导致不兼容老版本,会导致你的程序运行不起来。


搜索软件包

上面说了用pip install安装时要写完整的软件包名,记住全名这是比较难的,而且还有李鬼的存在。另外有时只知道功能,不知道软件名叫什么,就需要使用搜索功能去pypi搜索一下。



pip search 关键字



比如我需要一个有压缩功能的第三方库,可以使用 compress 这个关键字去检索。左边是第三方库名,括号里是软件版本,后边是简单的功能描述。


当然,现在要查找第三方库一般都是借助搜索引擎,搜索引擎的检索更智能,更相关,或者直接去pypi.org网站上找。


卸载软件包

使用如下卸载命令:


pip uninstall 软件包名

就可以卸载软件包,卸载软件包之前最好先用show命令看一下该软件包的被依赖关系,如果其它包依赖你要卸载的软件包,那么你卸载后,其它软件包就没法运行了。



pip show 软件包名


使用pip show命令可以查看该包的一些信息。比如查看requests库的信息:


pip show requests


说下 pip 使用入门指南_JAVA_03

可以查看该软件包的作者,软件安装路径,依赖的库和被依赖的库等息息。

要注意看Required-by那一项,如果冒号后面显示有其他的库,那你卸载requests库就要小心,因为它被其他库依赖了,卸载的话其他库就会出问题。


显示本地软件包

如果我们卸载软件包,忘记该软件包名的全称了呢,可以使用list命令:


pip list


说下 pip 使用入门指南_JAVA_04

list命令显示本地所有安装的第三方库和相应的版本号,这时就可以查看完整的软件包名是怎么写的。


导出本地所有软件包名和版本号

如果你要在另一台电脑上部署一个相同的Python软件包环境,尤其是你在本地开发测试好后,要提交到生产环境去运行,要保证软件包的版本是一致的,上面讲了软件包版本不一致可能会导致程序出错。


这时就可以使用freeze命令导出本地的软件包名和版本号。


pip freeze > requirements.txt

上面命令会把软件包名和版本号导到requirements.txt文件里,如下图:

说下 pip 使用入门指南_JAVA_05


然后把requirements.txt文件拷贝到另一台机器上,运行如下命令:


pip install -r requirements.txt

就会在另一台机器上完全安装跟本地一模一样的软件包环境。这比较方便开发和部署,以免本地的软件包和生产环境的不一致。


上面讲了卸载指定的软件包命令是:


pip uninstall 软件包名

那么要一键卸载全部的第三方软件包呢?也是可以使用requirements.txt文件:


pip uninstall -r requirements.txt

这样可以一键卸载所有的第三方软件包,因为requirements.txt文件里包含了所有的第三方软件包。


上面也讲了升级指定软件包的命令是:


pip install upgrade 软件包名

那么要一键升级所有的第三方软件包呢?


pip install --upgrade -r requirements.txt

是的,也是使用requirements.txt文件来实现,但是要把requirements.txt文件里的==号替换成>=符号

说下 pip 使用入门指南_java_06

意思是安装大于等于当前版本的软件包。



OK,pip入门指南说完了,当然python的包管理工具也不只有pip。

还有Conda、Pipenv、Poetry等,哪个用得熟练就用那个。


另外,Conda、Pipenv的好处是不只是包管理工具,还能管理虚拟路径。就是你电脑如果安装了多个版本的Python,比如同时有2.7/3.4/3.7的Python,它能很好管理每个Python版本的软件包和路径,不会发生冲突。