今天聊下pip的各种花式用法,熟练使用pip可以更方便的管理Python第三方库。
pip是什么
不免俗套的要先介绍一下,pip是Python的第三方包(库)管理器,Python有内置的标准库,在你安装完Python后这些标准库都已默认安装好了,但是还有很多有用的Pyhon库不是内置安装的,我们叫这些库为第三方库,要通过pip来安装和管理第三方库,还会管理库之间的依赖(dependency)关系。
举例:
Python的默认网络请求库是urllib,在Python安装的时候就已经是自带的,我们叫着这种为内置库,或标准库。但是有更好用的网络请求库:requests,它需要额外安装,比如使用
pip install requests
命令来安装,这种需要额外安装的库就叫做第三方库。pip就是来安装和管理第三方库的。
下面说的软件包都指代第三方库。
题外话:
不是所有的第三方Python包都能通过pip来安装,只能是发布在pypi.org上面的才能通过pip安装。
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 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
可以查看该软件包的作者,软件安装路径,依赖的库和被依赖的库等息息。
要注意看Required-by那一项,如果冒号后面显示有其他的库,那你卸载requests库就要小心,因为它被其他库依赖了,卸载的话其他库就会出问题。
显示本地软件包
如果我们卸载软件包,忘记该软件包名的全称了呢,可以使用list命令:
pip list
list命令显示本地所有安装的第三方库和相应的版本号,这时就可以查看完整的软件包名是怎么写的。
导出本地所有软件包名和版本号
如果你要在另一台电脑上部署一个相同的Python软件包环境,尤其是你在本地开发测试好后,要提交到生产环境去运行,要保证软件包的版本是一致的,上面讲了软件包版本不一致可能会导致程序出错。
这时就可以使用freeze命令导出本地的软件包名和版本号。
pip freeze > requirements.txt
上面命令会把软件包名和版本号导到requirements.txt文件里,如下图:
然后把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文件里的==号替换成>=符号
意思是安装大于等于当前版本的软件包。
OK,pip入门指南说完了,当然python的包管理工具也不只有pip。
还有Conda、Pipenv、Poetry等,哪个用得熟练就用那个。
另外,Conda、Pipenv的好处是不只是包管理工具,还能管理虚拟路径。就是你电脑如果安装了多个版本的Python,比如同时有2.7/3.4/3.7的Python,它能很好管理每个Python版本的软件包和路径,不会发生冲突。