全部的 Python 開發者都清楚,Python 之因此如此受歡迎,可以在衆多高級語言中,脫穎而出,除了語法簡單,上手容易以外,更多還要歸功於 Python 生態的完備,有數以萬計的 Python 愛好者願意以 Python 爲基礎封裝出各類有利於開發的第三方工具包。python
這才使用咱們可以以最快的速度開發出一個知足基本須要的項目,而不是每次都重複造輪子。linux
Python 從1991年誕生到如今,已通過去28個年頭了,這其間產生了數以萬計的第三方包,且每一個包都會不斷更新,會有愈來愈多的版本。shell
當你在一個複雜的項目環境中,若是沒有一個有效的依賴包管理方案,項目的維護將會是一個大問題。macos
pip 是官方推薦的包管理工具,在大多數開發者眼裏,pip 幾乎是 Python 的標配。編程
固然也有其餘的包管理工具python3.x
distutils:僅用於打包和安裝,嚴格來說不算是包管理工具服務器
setuptools:distutils的加強版,擴展了distutils,提供更多的功能,引入包依賴的管理,easy_install就是它的一個命令行工具,引入了 egg 的文件格式。網絡
Pipenv:一個集依賴包管理(pip)及虛擬環境管理(virtualenv)的工具python2.7
今天的主角是 pip ,你們確定不會陌生。但我相信很多人,只是熟悉幾個經常使用的用法,而對於其餘幾個低頻且實用的用法,卻知之甚少,這兩天,我查閱官方文檔,把這些用法整理了一下,應該是網絡上比較全的介紹。ide
查詢當前環境安裝的全部軟件包
$ pip list
查詢 pypi 上含有某名字的包
$ pip search pkg
查詢當前環境中可升級的包
$ pip list --outdated
查詢一個包的詳細內容
$ pip show pkg
在不安裝軟件包的狀況下下載軟件包到本地
$ pip download --destination-directory /local/wheels -r requirements.txt
下載完,總歸是要安裝的,能夠指定這個目錄中安裝軟件包,而不從 pypi 上安裝。
$ pip install --no-index --find-links=/local/wheels -r requirements.txt
固然你也從你下載的包中,本身構建生成 wheel 文件
$ pip install wheel $ pip wheel --wheel-dir=/local/wheels -r requirements.txt
使用 pip install <pkg>
能夠很方便地從 pypi 上搜索下載並安裝 python 包。
以下所示
$ pip install requests
這是安裝包的基本格式,咱們也能夠爲其添加更多參數來實現不一樣的效果。
3.1 只從本地安裝,而不從 pypi 安裝
# 前提你得保證你已經下載 pkg 包到 /local/wheels 目錄下 $ pip install --no-index --find-links=/local/wheels pkg
3.2 限定版本進行軟件包安裝
如下三種,對單個 python 包的版本進行了約束
# 所安裝的包的版本爲 2.1.2 $ pip install pkg==2.1.2 # 所安裝的包必須大於等於 2.1.2 $ pip install pkg>=2.1.2 # 所安裝的包必須小於等於 2.1.2 $ pip install pkg<=2.1.2
如下命令用於管理/控制整個 python 環境的包版本
# 導出依賴包列表 pip freeze >requirements.txt # 從依賴包列表中安裝 pip install -r requirements.txt # 確保當前環境軟件包的版本(並不確保安裝) pip install -c constraints.txt
3.3 限制不使用二進制包安裝
因爲默認狀況下,wheel 包的平臺是運行 pip download 命令 的平臺,因此可能出現平臺不適配的狀況。
好比在 MacOS 系統下獲得的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl 就不能在 linux_x86_64 安裝。
使用下面這條命令下載的是 tar.gz 的包,能夠直接使用 pip install 安裝。
比 wheel 包,這種包在安裝時會進行編譯,因此花費的時間會長一些。
# 下載非二進制的包 $ pip download --no-binary=:all: pkg # 安裝非二進制的包 $ pip install pkg --no-binary
3.4 指定代理服務器安裝
當你身處在一個內網環境中時,沒法直接鏈接公網。這時候你使用pip install
安裝包,就會失敗。
面對這種狀況,能夠有兩種方法:
第一種方法,雖然說可行,但有至關多的弊端
這裏重點來介紹,第二種方法:
$ pip install --proxy [user:passwd@]http_server_ip:port pkg
每次安裝包就發輸入長長的參數,未免有些麻煩,爲此你能夠將其寫入配置文件中:$HOME/.config/pip/pip.conf
對於這個路徑,說明幾點
# Linux/Unix: /etc/pip.conf ~/.pip/pip.conf ~/.config/pip/pip.conf # Mac OSX: ~/Library/Application Support/pip/pip.conf ~/.pip/pip.conf /Library/Application Support/pip/pip.conf # Windows: %APPDATA%\pip\pip.ini %HOME%\pip\pip.ini C:\Documents and Settings\All Users\Application Data\PyPA\pip\pip.conf (Windows XP) C:\ProgramData\PyPA\pip\pip.conf (Windows 7及之後)
如何配置,這邊給個樣例:
[global] index-url = http://mirrors.aliyun.com/pypi/simple/ # 替換出本身的代理地址,格式爲[user:passwd@]proxy.server:port proxy=http://xxx.xxx.xxx.xxx:8080 [install] # 信任阿里雲的鏡像源,不然會有警告 trusted-host=mirrors.aliyun.com
3.5 安裝用戶私有軟件包
不少人可能還不清楚,python 的安裝包是能夠用戶隔離的。
若是你擁有管理員權限,你能夠將包安裝在全局環境中。在全局環境中的這個包可被該機器上的全部擁有管理員權限的用戶使用。
若是一臺機器上的使用者不僅同樣,自私地將在全局環境中安裝或者升級某個包,是不負責任且危險的作法。
面對這種狀況,咱們就想可否安裝單獨爲我所用的包呢?
慶幸的是,還真有。
我能想到的有兩種方法:
虛擬環境,以前寫過幾篇文章,這裏再也不展開講。
今天的重點是第二種方法,教你如何安裝用戶私有的包?
命令也很簡單,只要加上 --user
參數,pip 就會將其安裝在當前用戶的 ~/.local/lib/python3.x/site-packages
下,而其餘用戶的 python 則不會受影響。
pip install --user pkg
來舉個例子
# 在全局環境中未安裝 requests [root@localhost ~]# pip list | grep requests [root@localhost ~]# su - wangbm [root@localhost ~]# # 因爲用戶環境繼承自全局環境,這裏也未安裝 [wangbm@localhost ~]# pip list | grep requests [wangbm@localhost ~]# pip install --user requests [wangbm@localhost ~]# pip list | grep requests requests (2.22.0) [wangbm@localhost ~]# # 從 Location 屬性可發現 requests 只安裝在當前用戶環境中 [wangbm@ws_compute01 ~]$ pip show requests --- Metadata-Version: 2.1 Name: requests Version: 2.22.0 Summary: Python HTTP for Humans. Home-page: http://python-requests.org Author: Kenneth Reitz Author-email: me@kennethreitz.org Installer: pip License: Apache 2.0 Location: /home/wangbm/.local/lib/python2.7/site-packages [wangbm@localhost ~]$ exit logout # 退出 wangbm 用戶,在 root 用戶環境中發現 requests 未安裝 [root@localhost ~]$ pip list | grep requests [root@localhost ~]$
當你身處我的用戶環境中,python 導包時會先檢索當前用戶環境中是否已安裝這個包,已安裝則優先使用,未安裝則使用全局環境中的包。
驗證以下:
>>> import sys >>> from pprint import pprint >>> 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'] >>>
就一條命令,再也不贅述
$ pip uninstall pkg
想要對現有的 python 進行升級,其本質上也是先從 pypi 上下載最新版本的包,再對其進行安裝。因此升級也是使用 pip install
,只不過要加一個參數 --upgrade
。
$ pip install --upgrade pkg
在升級的時候,其實還有一個不怎麼用到的選項 --upgrade-strategy
,它是用來指定升級策略。
它的可選項只有兩個:
eager
:升級所有依賴包only-if-need
:只有當舊版本不能適配新的父依賴包時,纔會升級。在 pip 10.0 版本以後,這個選項的默認值是 only-if-need
,所以以下兩種寫法是一互致的。
pip install --upgrade pkg1 pip install --upgrade pkg1 --upgrade-strategy only-if-need
以上幾乎包含了 pip 的全部經常使用使用場景,爲了方便,我將其整理成一張表格,若是你須要,可×××n編程時光),後臺回覆「pip」,可獲取高清無水印圖片。