Python里的 pip 使用指南(超全)

所有的 Python 開發(fā)者都清楚肆捕,Python 之所以如此受歡迎盖高,能夠在眾多高級語言中,脫穎而出喻奥,除了語法簡單撞蚕,上手容易之外诈豌,更多還要歸功于 Python 生態(tài)的完備矫渔,有數(shù)以萬計的 Python 愛好者愿意以 Python 為基礎封裝出各種有利于開發(fā)的第三方工具包庙洼。

這才使用我們能夠以最快的速度開發(fā)出一個滿足基本需要的項目油够,而不是每次都重復造輪子征懈。

Python 從1991年誕生到現(xiàn)在卖哎,已經(jīng)過去28個年頭了删性,這其間產(chǎn)生了數(shù)以萬計的第三方包蹬挺,且每個包都會不斷更新巴帮,會有越來越多的版本榕茧。

當你在一個復雜的項目環(huán)境中雪猪,如果沒有一個有效的依賴包管理方案起愈,項目的維護將會是一個大問題。

pip 是官方推薦的包管理工具官觅,在大多數(shù)開發(fā)者眼里休涤,pip 幾乎是 Python 的標配笛辟。

當然也有其他的包管理工具

  • distutils:僅用于打包和安裝,嚴格來講不算是包管理工具

  • setuptools:distutils的增強版捷凄,擴展了distutils跺涤,提供更多的功能监透,引入包依賴的管理,easy_install就是它的一個命令行工具院刁,引入了 egg 的文件格式黎比。

  • Pipenv:一個集依賴包管理(pip)及虛擬環(huán)境管理(virtualenv)的工具

  • 還有其他的超营,這里不一一列出演闭。

今天的主角是 pip 米碰,大家肯定不會陌生吕座。但我相信不少人瘪板,只是熟悉幾個常用的用法侮攀,而對于其他幾個低頻且實用的用法兰英,卻知之甚少,這兩天陨闹,我查閱官方文檔趋厉,把這些用法整理了一下胶坠,應該是網(wǎng)絡上比較全的介紹。

1. 查詢軟件包

查詢當前環(huán)境安裝的所有軟件包

$ pip list

查詢 pypi 上含有某名字的包

$ pip search pkg

查詢當前環(huán)境中可升級的包

$ pip list --outdated

查詢一個包的詳細內容

$ pip show pkg

2. 下載軟件包

在不安裝軟件包的情況下下載軟件包到本地

$ 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

3. 安裝軟件包

使用 pip install <pkg> 可以很方便地從 pypi 上搜索下載并安裝 python 包审姓。

如下所示

$ pip install requests

這是安裝包的基本格式魔吐,我們也可以為其添加更多參數(shù)來實現(xiàn)不同的效果莱找。

3.1 只從本地安裝奥溺,而不從 pypi 安裝

# 前提你得保證你已經(jīng)下載 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 環(huán)境的包版本

# 導出依賴包列表
pip freeze >requirements.txt

# 從依賴包列表中安裝
pip install -r requirements.txt

# 確保當前環(huán)境軟件包的版本(并不確保安裝)
pip install -c constraints.txt

3.3 限制不使用二進制包安裝

由于默認情況下相满,wheel 包的平臺是運行 pip download 命令 的平臺雳灵,所以可能出現(xiàn)平臺不適配的情況闸盔。

比如在 MacOS 系統(tǒng)下得到的 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 指定代理服務器安裝

當你身處在一個內網(wǎng)環(huán)境中時,無法直接連接公網(wǎng)嫌松。這時候你使用pip install 安裝包萎羔,就會失敗外驱。

面對這種情況昵宇,可以有兩種方法:

  1. 下載離線包拷貝到內網(wǎng)機器中安裝
  2. 使用代理服務器轉發(fā)請求

第一種方法瓦哎,雖說可行蒋譬,但有相當多的弊端

  • 步驟繁雜愉适,耗時耗力
  • 無法處理包的依賴問題

這里重點來介紹维咸,第二種方法:

$ pip install --proxy [user:passwd@]http_server_ip:port pkg

每次安裝包就發(fā)輸入長長的參數(shù),未免有些麻煩瞬哼,為此你可以將其寫入配置文件中:$HOME/.config/pip/pip.conf

對于這個路徑坐慰,說明幾點

  • 不同的操作系統(tǒng)用僧,路徑各不相同
# 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及以后) 
  • 若在你的機子上沒有此文件责循,則自行創(chuàng)建即可

如何配置沼死,這邊給個樣例:

[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 的安裝包是可以用戶隔離的谴麦。

如果你擁有管理員權限,你可以將包安裝在全局環(huán)境中舷蟀。在全局環(huán)境中的這個包可被該機器上的所有擁有管理員權限的用戶使用野宜。

如果一臺機器上的使用者不只一樣匈子,自私地將在全局環(huán)境中安裝或者升級某個包,是不負責任且危險的做法闯袒。

面對這種情況虎敦,我們就想能否安裝單獨為我所用的包呢?

慶幸的是搁吓,還真有原茅。

我能想到的有兩種方法:

  1. 使用虛擬環(huán)境
  2. 將包安裝在用戶的環(huán)境中

虛擬環(huán)境,之前寫過幾篇文章堕仔,這里不再展開講擂橘。

今天的重點是第二種方法,教你如何安裝用戶私有的包摩骨?

命令也很簡單通贞,只要加上 --user 參數(shù),pip 就會將其安裝在當前用戶的 ~/.local/lib/python3.x/site-packages 下恼五,而其他用戶的 python 則不會受影響灾馒。

pip install --user pkg

來舉個例子

# 在全局環(huán)境中未安裝 requests
[root@localhost ~]# pip list | grep requests   
[root@localhost ~]# su - wangbm
[root@localhost ~]# 

# 由于用戶環(huán)境繼承自全局環(huán)境旭斥,這里也未安裝
[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 屬性可發(fā)現(xiàn) requests 只安裝在當前用戶環(huán)境中
[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 用戶環(huán)境中發(fā)現(xiàn) requests 未安裝
[root@localhost ~]$ pip list | grep requests
[root@localhost ~]$ 

當你身處個人用戶環(huán)境中职祷,python 導包時會先檢索當前用戶環(huán)境中是否已安裝這個包淳梦,已安裝則優(yōu)先使用,未安裝則使用全局環(huán)境中的包。

驗證如下:

>>> 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']
>>> 

4. 卸載軟件包

就一條命令,不再贅述

$ pip uninstall pkg

5. 升級軟件包

想要對現(xiàn)有的 python 進行升級,其本質上也是先從 pypi 上下載最新版本的包,再對其進行安裝蕾总。所以升級也是使用 pip install午绳,只不過要加一個參數(shù) --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”,可獲取高清無水印圖片。

image

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桨吊,隨后出現(xiàn)的幾起案子卷要,更是在濱河造成了極大的恐慌症歇,老刑警劉巖凄吏,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诸蚕,居然都是意外死亡妄均,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剪决,“玉大人,你說我怎么就攤上這事命锄∑甓鳎” “怎么了韵卤?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵屋厘,是天一觀的道長鲫构。 經(jīng)常有香客問我树肃,道長,這世上最難降的妖魔是什么瀑罗? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任胸嘴,我火速辦了婚禮雏掠,結果婚禮上,老公的妹妹穿的比我還像新娘劣像。我一直安慰自己乡话,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布驾讲。 她就那樣靜靜地躺著蚊伞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吮铭。 梳的紋絲不亂的頭發(fā)上时迫,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音谓晌,去河邊找鬼掠拳。 笑死,一個胖子當著我的面吹牛纸肉,可吹牛的內容都是我干的溺欧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼柏肪,長吁一口氣:“原來是場噩夢啊……” “哼姐刁!你這毒婦竟也來了?” 一聲冷哼從身側響起烦味,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤聂使,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谬俄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柏靶,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年溃论,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎蜓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡钥勋,死狀恐怖炬转,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情算灸,我是刑警寧澤扼劈,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站乎婿,受9級特大地震影響测僵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一捍靠、第九天 我趴在偏房一處隱蔽的房頂上張望沐旨。 院中可真熱鬧,春花似錦榨婆、人聲如沸磁携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谊迄。三九已至,卻和暖如春烟央,著一層夾襖步出監(jiān)牢的瞬間统诺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工疑俭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粮呢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓钞艇,卻偏偏與公主長得像啄寡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哩照,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容