Python 之所以如此受歡迎,能夠在眾多高級語言中,脫穎而出,除了語法簡單,上手容易之外,更多還要歸功於 Python 完備的生態環境,有數以萬計的 Python 愛好者願意以 Python 為基礎封裝出各種有利於開發的第三方工具包。
Python 從1991年誕生到現在,已經過去28個年頭了,這其間編寫了數以萬計的第三方包,且每個包都會不斷更新,會有越來越多的版本。
當你在一個復雜的項目環境中,如果沒有一個有效的依賴包管理方案,項目的維護將會是一個大問題。
pip 是官方推薦的包管理工具,在大多數開發者眼里,pip 幾乎是 Python 的標配。
當然也有其他的包管理工具
- distutils:僅用於打包和安裝,嚴格來講不算是包管理工具
- Pipenv:一個集依賴包管理(pip)及虛擬環境管理(virtualenv)的工具
- 等等......
pip 常用的用法
1. 查詢軟件包
查詢當前環境安裝的所有軟件包
1 >> pip list
查詢 pypi 上含有某名字的包
1 >> pip search pkg
查詢當前環境中可升級的包
1 >> pip list --outdated
查詢一個包的詳細內容
1 >> pip show pkg
2. 下載軟件包
在不安裝軟件包的情況下下載軟件包到本地
1 >> pip download --destination-directory /local/wheels -r requirements.txt
下載完,總歸是要安裝的,可以指定這個目錄中安裝軟件包,而不從 pypi 上安裝。
1 >> pip install --no-index --find-links=/local/wheels -r requirements.txt
當然你也從你下載的包中,自己構建生成 wheel 文件
1 >> pip install wheel 2 >> pip wheel --wheel-dir=/local/wheels -r requirements.txt
3. 安裝軟件包
使用 pip install <pkg>
可以很方便地從 pypi 上搜索下載並安裝 python 包。
如下所示
1 >> pip install requests
這是安裝包的基本格式,我們也可以為其添加更多參數來實現不同的效果。
3.1 只從本地安裝,而不從 pypi 安裝
1 # 前提你得保證你已經下載 pkg 包到 /local/wheels 目錄下 2 >> pip install --no-index --find-links=/local/wheels pkg
3.2 限定版本進行軟件包安裝
以下三種,對單個 python 包的版本進行了約束
1 # 所安裝的包的版本為 2.1.2 2 >> pip install pkg==2.1.2 3 4 # 所安裝的包必須大於等於 2.1.2 5 >> pip install pkg>=2.1.2 6 7 # 所安裝的包必須小於等於 2.1.2 8 >> pip install pkg<=2.1.2
以下命令用於管理/控制整個 python 環境的包版本
1 # 導出依賴包列表 2 >> pip freeze >requirements.txt 3 4 # 從依賴包列表中安裝 5 >> pip install -r requirements.txt 6 7 # 確保當前環境軟件包的版本(並不確保安裝) 8 >> 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 包,這種包在安裝時會進行編譯,所以花費的時間會長一些。
1 # 下載非二進制的包 2 >> pip download --no-binary=:all: pkg 3 4 # 安裝非二進制的包 5 >> pip install pkg --no-binary
3.4 指定代理服務器安裝
當你身處在一個內網環境中時,無法直接連接公網。這時候你使用pip install
安裝包,就會失敗。
面對這種情況,可以有兩種方法:
- 下載離線包拷貝到內網機器中安裝
- 使用代理服務器轉發請求
第一種方法,雖說可行,但有相當多的弊端
- 步驟繁雜,耗時耗力
- 無法處理包的依賴問題
這里重點來介紹,第二種方法:
1 >> pip install --proxy [user:passwd@]http_server_ip:port pkg
每次安裝包就發輸入長長的參數,未免有些麻煩,為此你可以將其寫入配置文件中:$HOME/.config/pip/pip.conf
對於這個路徑,說明幾點
- 不同的操作系統,路徑各不相同
1 # Linux/Unix: 2 /etc/pip.conf 3 ~/.pip/pip.conf 4 ~/.config/pip/pip.conf 5 6 # Mac OSX: 7 ~/Library/Application Support/pip/pip.conf 8 ~/.pip/pip.conf 9 /Library/Application Support/pip/pip.conf 10 11 # Windows: 12 %APPDATA%\pip\pip.ini 13 %HOME%\pip\pip.ini 14 C:\Documents and Settings\All Users\Application Data\PyPA\pip\pip.conf (Windows XP) 15 C:\ProgramData\PyPA\pip\pip.conf (Windows 7及以后)
3.5 安裝用戶私有軟件包
很多人可能還不清楚,python 的安裝包是可以用戶隔離的。
如果你擁有管理員權限,你可以將包安裝在全局環境中。在全局環境中的這個包可被該機器上的所有擁有管理員權限的用戶使用。
如果一台機器上的使用者不只一樣,自私地將在全局環境中安裝或者升級某個包,是不負責任且危險的做法。
面對這種情況,我們就想能否安裝單獨為我所用的包呢?
慶幸的是,還真有。
我能想到的有兩種方法:
- 使用虛擬環境
- 將包安裝在用戶的環境中
虛擬環境,之前寫過幾篇文章,這里不再展開講。
今天的重點是第二種方法,教你如何安裝用戶私有的包?
命令也很簡單,只要加上 --user
參數,pip 就會將其安裝在當前用戶的 ~/.local/lib/python3.x/site-packages
下,而其他用戶的 python 則不會受影響。
1 pip install --user pkg
來舉個例子
1 # 在全局環境中未安裝 requests 2 [root@localhost ~]# pip list | grep requests 3 [root@localhost ~]# su - wangbm 4 [root@localhost ~]# 5 6 # 由於用戶環境繼承自全局環境,這里也未安裝 7 [wangbm@localhost ~]# pip list | grep requests 8 [wangbm@localhost ~]# pip install --user requests 9 [wangbm@localhost ~]# pip list | grep requests 10 requests (2.22.0) 11 [wangbm@localhost ~]# 12 13 # 從 Location 屬性可發現 requests 只安裝在當前用戶環境中 14 [wangbm@ws_compute01 ~]$ pip show requests 15 --- 16 Metadata-Version: 2.1 17 Name: requests 18 Version: 2.22.0 19 Summary: Python HTTP for Humans. 20 Home-page: http://python-requests.org 21 Author: Kenneth Reitz 22 Author-email: me@kennethreitz.org 23 Installer: pip 24 License: Apache 2.0 25 Location: /home/wangbm/.local/lib/python2.7/site-packages 26 [wangbm@localhost ~]$ exit 27 logout 28 29 # 退出 wangbm 用戶,在 root 用戶環境中發現 requests 未安裝 30 [root@localhost ~]$ pip list | grep requests 31 [root@localhost ~]$
當你身處個人用戶環境中,python 導包時會先檢索當前用戶環境中是否已安裝這個包,已安裝則優先使用,未安裝則使用全局環境中的包。
驗證如下:
1 >>> import sys 2 >>> from pprint import pprint 3 >>> pprint(sys.path) 4 ['', 5 '/usr/lib64/python27.zip', 6 '/usr/lib64/python2.7', 7 '/usr/lib64/python2.7/plat-linux2', 8 '/usr/lib64/python2.7/lib-tk', 9 '/usr/lib64/python2.7/lib-old', 10 '/usr/lib64/python2.7/lib-dynload', 11 '/home/wangbm/.local/lib/python2.7/site-packages', 12 '/usr/lib64/python2.7/site-packages', 13 '/usr/lib64/python2.7/site-packages/gtk-2.0', 14 '/usr/lib/python2.7/site-packages', 15 '/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg', 16 '/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg'] 17 >>>
4. 卸載軟件包
就一條命令,不再贅述
1 >> pip uninstall pkg
5. 升級軟件包
想要對現有的 python 進行升級,其本質上也是先從 pypi 上下載最新版本的包,再對其進行安裝。所以升級也是使用 pip install
,只不過要加一個參數 --upgrade
。
1 >> pip install --upgrade pkg
在升級的時候,其實還有一個不怎么用到的選項 --upgrade-strategy
,它是用來指定升級策略。
它的可選項只有兩個:
eager
:升級全部依賴包only-if-need
:只有當舊版本不能適配新的父依賴包時,才會升級。
在 pip 10.0 版本之后,這個選項的默認值是 only-if-need
,因此如下兩種寫法是一互致的。
1 pip install --upgrade pkg1 2 pip install --upgrade pkg1 --upgrade-strategy only-if-need
以上幾乎包含了 pip 的所有常用使用場景,為了方便,我將其整理成一張表格,如果你
歸類 : python起步