所有Python开发者都知道,Python之所以如此受欢迎,能在众多高级语言中脱颖而出,是因为语法简单并且易于使用。更得益于Python生态系统的完备性,数以万计的Python爱好者愿意打包各种有利于基于Python开发的第三方工具包。这让我们能够以最快的速度开发出满足基本需求的项目,而不是每次都重新造轮子。从1991年Python诞生到现在已经28年了,这期间产生了数以万计的第三方包,而且每个包都会不断更新,版本也会越来越多。当你在一个复杂的项目环境中,如果没有一个有效的依赖包管理解决方案,项目维护就会成为一个大问题。pip是官方推荐的包管理工具。在大多数开发者眼中,pip几乎是Python的标配。当然还有其他包管理工具distutils:只是用来打包安装,严格来说不是包管理工具setuptools:distutils的增强版,扩展了distutils,提供了更多功能,引入了包依赖管理。easy_install是一个导入egg文件格式的命令行工具。Pipenv:集成依赖包管理(pip)和虚拟环境管理(virtualenv)的工具还有其他工具,这里就不一一列举了。今天的主角是pip,想必大家对它并不陌生。但相信很多人只熟悉几个常用的用法,而对其他低频实用的用法知之甚少。这两天查了下官方文档,整理了一下这些用法。应该是网上比较全面的介绍。1.查询软件包查询当前环境下安装的所有软件包$piplist查询pypi上某个名称的包$pipsearchpkg查询当前环境下可升级的包$piplist--outdated查询某个包的详细信息$pip显示pkg2。下载软件包将软件包下载到本地而不安装软件包$pipdownload--destination-directory/local/wheels-rrequirements.txt下载后无论如何都要安装,可以指定这个目录安装包无需从pypi安装。$pipinstall--no-index--find-links=/local/wheels-rrequirements.txt当然,你也可以从你下载的包中自己构建生成wheel文件$pipinstallwheel$pipwheel--wheel-dir=/local/wheels-rrequirements.txt3.安装包使用pipinstall可以很方便的从pypi中搜索、下载并安装python包。如下所示$pipinstallrequests这是安装包的基本格式,我们还可以在其中添加更多的参数来实现不同的效果。3.1只从本地安装,不从pypi安装#前提你要保证你已经下载了pkg包到/local/wheels目录$pipinstall--no-index--find-links=/local/wheelspkg3.2limitation以下三种软件包安装都是按版本进行的,对单个python包的版本有限制#安装包的版本是2.1.2$pipinstallpkg==2.1.2#安装包必须是大于等于2.1.2$pipinstallpkg>=2.1.2#安装的包必须小于等于2.1.2$pipinstallpkg<=2.1.2以下命令用于管理/控制整个python环境的包版本#导出依赖包列表pipfreeze>requirements.txt#从依赖包列表中安装pipinstall-rrequirements.txt#保证当前环境包的版本(不保证安装)pipinstall-cconstraints.txt3.3限制不使用二进制包安装因为默认情况下,wheel包的平台就是运行pip下载命令的平台,所以平台可能不兼容。例如在macOS系统下获取的pymongo-2.8-cp27-none-macosx_10_10_intel.whl无法安装到linux_x86_64上。使用以下命令下载tar.gz包,可以直接使用pipinstall安装。与wheel包相比,这个包会在安装的时候编译,所以会耗时更长。#下载非二进制包$pipdownload--no-binary=:all:pkg# 安装非二进制包$pipinstallpkg--no-binary3.4指定代理服务器安装时在a中网络环境,不能直接连接公网。这时候如果使用pipinstall安装包就会失败。面对这种情况,有两种方法:下载离线包,复制到内网机器上安装。使用代理服务器转发请求。第一种方法虽然可行,但弊端颇多,步骤繁琐,费时费力,无法操作。这里主要介绍包依赖问题。第二种方法:$pipinstall--proxy[user:passwd@]http_server_ip:portpkg每次安装包都要发送和输入长参数,有点麻烦。为此,可以将其写入配置文件:$HOME/.config/pip/pip.conf对于这个路径,针对不同的操作系统说明几点,路径不同#Linux/Unix:/etc/pip.conf~/.pip/pip.conf~/.config/pip/pip.conf#MacOSX:~/Library/ApplicationSupport/pip/pip.conf~/.pip/pip.conf/Library/ApplicationSupport/pip/pip.conf#Windows:%APPDATA%\pip\pip.ini%HOME%\pip\pip.iniC:\DocumentsandSettings\AllUsers\ApplicationData\PyPA\pip\pip.conf(WindowsXP)C:\ProgramData\PyPA\pip\pip.conf(Windows7及更高版本)如果你的机器上没有这个文件,你可以自己创建它来配置它。下面是一个例子:[global]index-url=http://mirrors.aliyun.com/pypi/simple/#替换成你自己的代理地址,格式为[user:passwd@]proxy.server:portproxy=http://xxx.xxx.xxx.xxx:8080[install]#信任阿里云镜像源,否则会有警告trusted-host=mirrors.aliyun.com3.5安装用户私有软件包很多人可能不知道python安装包可以与用户隔离。如果您有管理员权限,则可以全局安装包。全局环境中的包可供在计算机上具有管理员权限的所有用户使用。如果一台机器上有不同的用户,在全局环境下私自安装或升级某个包是不负责任和危险的。面对这种情况,我们想知道能不能安装一个只给我一个包?幸运的是,真的有。我能想到的有两种方式:使用虚拟环境在用户环境虚拟环境中安装包,之前写过好几篇文章,这里就不展开了。今天的重点是第二种方法,教大家如何安装用户私有包?命令也很简单,只要加上--user参数,pip就会安装在当前用户的~/.local/lib/python3.x/site-packages下,而其他用户的python不受影响.pipinstall--userpkg举个例子#requests[root@localhost~]没有安装在全局环境#piplist|greprequests[root@localhost~]#su-wangbm[root@localhost~]##由于用户环境继承自全局环境,这里没有安装[wangbm@localhost~]#piplist|grep请求[wangbm@localhost~]#pipinstall--userrequests[wangbm@localhost~]#piplist|greprequestsrequests(2.22.0)[wangbm@localhost~]##从Location属性可以发现requests只安装在当前用户环境下[wangbm@ws_compute01~]$pipshowrequests---Metadata-版本:2.1名称:requests版本:2.22.0总结:人类的PythonHTTP。主页:http://python-requests.org作者:KennethReitz作者电子邮件:me@kennethreitz.org安装程序:pipLicense:Apache2.0位置:/home/wangbm/.local/lib/python2.7/site-packages[wangbm@localhost~]$exitlogout#退出wangbm用户,发现root用户环境下没有安装requests[root@localhost~]$piplist|greprequests[root@localhost~]$当你在个人用户环境下,python导入包时,会先检查当前用户环境下是否安装了该包。如果已安装,它将首先使用。如果没有安装,则使用全局环境中的包。验证如下:>>>importsys>>>frompprintimportpprint>>>pprint(sys.path)['','/usr/lib64/python27.zip','/usr/lib64/python2.7','/usr/lib64/python2.7/plat-linux2','/usr/lib64/python2.7/lib-tk','/usr/lib64/python2.7/lib-old','/usr/lib64/python2.7/lib-dynload','/home/wangbm/.local/lib/python2.7/site-packages','/usr/lib64/python2.7/site-packages','/usr/lib64/python2.7/site-packages/gtk-2.0','/usr/lib/python2.7/site-packages','/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg','/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg']>>>4.卸载软件包的命令只有一个,没有了详细信息将在$pipuninstallpkg5中给出。升级包如果要升级现有的python,其实质就是先从pypi下载最新版本的包,然后安装。所以升级也是使用pipinstall,但是需要加一个参数--upgrade。$pipinstall--upgradepkg升级的时候其实还有一个用得不多的选项--upgrade-strategy,用来指定升级策略。它只有两个选项:eager:upgradealldependentpackagesonly-if-need:只有当旧版本不能适应新的父依赖包时,才会升级。pip10.0版本之后,这个选项的默认值为only-if-need,所以下面两种写法是相互一致的。pipinstall--upgradepkg1pipinstall--upgradepkg1--upgrade-strategyonly-if-need包含了pip几乎所有常见的使用场景。为了方便,我把它整理成一张表。需要的可以关注我的公众号(Python编程时间),后台回复“pip”,即可获取无水印高清图片。