什么是 pip ?pip 是 Python 中的標(biāo)準(zhǔn)庫管理器慰丛。它允許你安裝和管理不屬于 Python標(biāo)準(zhǔn)庫 的其它軟件包圃阳。本教程就是為 Python 新手介紹 pip。
通過本教程璧帝,你將學(xué)到:
1. 安裝 Python 的標(biāo)準(zhǔn)發(fā)行版中未包含的其他軟件包
2. 查找發(fā)布于 Python 包索引(PyPI)的包
3. 管理腳本和應(yīng)用程序的安裝需求
4. 卸載包及它的相關(guān)依賴
如你所見捍岳,Python 社區(qū)非常活躍睬隶,并且為 pip 創(chuàng)建了一些簡潔的替代方案锣夹,你可以在本教程稍后的部分看到。
pip 入門
那么苏潜,什么是 pip 呢银萍?pip 是 Python 的包管理器。這意味著它是一個工具恤左,允許你安裝和管理不屬于標(biāo)準(zhǔn)庫的其他庫和依賴贴唇。
軟件包管理極其重要搀绣,所以自 Python3 的 3.4 版本以及 Python2 的 2.7.9 版本開始,pip 一直被直接包括在 Python 的安裝包內(nèi)戳气,同樣還被用于 Python 的其它項目中链患,這使得 pip 成為了每一個 Pythonista(Python用戶)必備的工具。
如果你已經(jīng)了解了其他語言瓶您,那么可能會對包管理器的概念比較熟悉麻捻。JavaScript 使用 npm 管理軟件包,Ruby 使用 gem呀袱,以及 .NET 使用 NuGet贸毕。Python 中,則是 pip 作為標(biāo)準(zhǔn)包管理器夜赵。
Python 的安裝器中自帶了 pip明棍,所以你可以直接使用它,除非你安裝的是更早版本的 Python寇僧。你可以通過在控制臺中運行以下命令來驗證 pip 是否可用:
你應(yīng)該可以看到一個類似的輸出,顯示 pip 的版本以及安裝位置還有 Python 的版本婉宰。如果你使用的是不包含 pip 的舊版本 Python歌豺,你可以根據(jù) pip 安裝文檔中相應(yīng)系統(tǒng)的說明進(jìn)行安裝。
你可能希望在虛擬環(huán)境中使用本教程的示例心包,以避免將包安裝到 Python 的全局安裝環(huán)境中类咧。你可以從 Python 虛擬環(huán)境:入門級了解虛擬環(huán)境相關(guān)的信息,這篇文章的”使用虛擬環(huán)境“一節(jié)介紹了創(chuàng)建虛擬環(huán)境的基礎(chǔ)知識蟹腾。
使用 pip 安裝軟件包
Python 被認(rèn)為是一種"內(nèi)置電池"式的語言痕惋。這表示 Python 標(biāo)準(zhǔn)庫包含大量的軟件包和模塊,這些模塊有助于開發(fā)人員開發(fā)腳本和應(yīng)用娃殖。
與此同時值戳,Python 擁有一個活躍的社區(qū),它提供了一個更大的軟件包集合炉爆,以供你開發(fā)所需堕虹。這些軟件包發(fā)布在 Python Package Index,也被稱為 PyPI(發(fā)音 Pie Pea Eye)芬首。PyPI 托管了大量包赴捞,包括開發(fā)框架,工具和庫郁稍。
其中很多軟件包通過為已有功能提供了友好地接口來簡化 Python 開發(fā)赦政。例如,你可以寫一個腳本耀怜,僅使用 Python 標(biāo)準(zhǔn)庫中的功能分析網(wǎng)頁的內(nèi)容:
腳本中桐愉,導(dǎo)入了 cgi 和 http.client,這兩個都是在 Python 的標(biāo)準(zhǔn)庫中掰派。你創(chuàng)建了一個 HTTPSConnection 對象并指定服務(wù)器从诲,然后調(diào)用 .request() 和 .getresponse() 解析響應(yīng)信息。
從響應(yīng)信息中碗淌,我們解析到 Content-Type 頭信息并且使用 cgi 模塊提取頁面編碼的字符集。
cgi.parse_header() 返回一個包括主要值和字典作為參數(shù)的元組抖锥。例如亿眠,Content-Type 頭信息可能包含一個像 text/html; charset=ISO-8859-1 的值。
這個元組將字符串 text/html 作為第一個元素磅废,第二個元素是 {'charset': 'ISO-8859-1'} 這樣形式的字典纳像。因為你只需要關(guān)心 charset 參數(shù),可以使用下劃線忽略元組的開頭:_, params = cgi.parse_header(content_type)拯勉。
注意:Python 中下劃線的含義解釋了如何從元組解包值竟趾。
對頁面編碼后,你可以閱讀相應(yīng)信息并解碼到文本中宫峦。你可以在控制臺中運行這個例子查看它是怎么工作的:
對于一個用于解析網(wǎng)頁內(nèi)容的小腳本來說,這看起來做的工作有點多导绷。幸運的是犀勒,有一個 Python 的包可以簡化 HTTP 請求并提供了一個友好地接口來實現(xiàn)你的期望。
基礎(chǔ)包安裝
PyPI 托管了一個非常流行的庫 requests 來完成 HTTP 請求妥曲。你可以通過它的官方文檔站點了解所有的相關(guān)信息贾费。
第一步是在你的環(huán)境中安裝 requests 包。你可以運行 pip help 來了解 pip 支持的命令:
如你所見,pip 提供了 install 命令來安裝軟件包葵萎。你可以運行它來安裝 requests 包:
你可以看到與上面類似的輸出信息。你可以使用 pip 以及 install 命令羡忘,其后跟著你想要安裝的包名锡足。pip 會在 PyPI 中查找這個包,計算其依賴關(guān)系壳坪,安裝并確保 requests 正常工作舶得。
你還可以看到當(dāng)前環(huán)境下 pip 的版本是 18.1,但是還有 19.0.1 版本可用爽蝴。它還顯示了用于升級 pip 的命令沐批,所以我們來試一下:
注意這里,你使用了 python -m 來升級 pip九孩。-m 開關(guān)告訴 Python 將模塊作為可執(zhí)行文件運行先馆。如果你要升級 pip,這么做是很有必要的躺彬,在安裝新的版本之前會卸載舊的版本煤墙,而當(dāng)工具在運行時卸載它自己會導(dǎo)致錯誤。
當(dāng)你將 pip 作為一個模塊運行時宪拥,Python 會將模塊加載到內(nèi)存中仿野,并允許在這個模塊包運行的時候刪除它。如果軟件包提供了頂層腳本 main.py她君,那么你可以像運行腳本一下運行這個軟件包脚作。
你已經(jīng)安裝了 requests 并升級了 pip,現(xiàn)在可以使用 list 命令查看你的環(huán)境中安裝了哪些軟件包缔刹。
如上所示,pip 已經(jīng)升級到了 19.0.1 版本(目前最新版本)校镐,并且安裝了 requests 2.21.0 版本亿扁。
命令 pip install 會查找并安裝軟件包的最新版本。同時還會搜索軟件包元數(shù)據(jù)中的依賴列表鸟廓,并安裝這些依賴以確保軟件包滿足所有的需求魏烫。
這里你可以看到安裝了很多軟件。你可以使用 pip 中的 show 命令查看包的元數(shù)據(jù)信息:
[圖片上傳失敗...(image-90ab4f-1565242498214)]
元數(shù)據(jù)中列出了依賴項 certifi肝箱,chardet哄褒,idna 和 urllib3,而且你可以看到這些都已經(jīng)安裝好了煌张。
既然已經(jīng)安裝了 requests 包呐赡,我們可以修改上面的例子,來看看如何更方便地解析網(wǎng)頁的內(nèi)容:
因為你已經(jīng)在開發(fā)環(huán)境中安裝了 requests 包链嘀,可以像導(dǎo)入其他標(biāo)準(zhǔn)庫一樣導(dǎo)入它。
可以看到档玻,requests.get() 處理了 HTTP 連接并返回一個與之前例子相似的響應(yīng)怀泊,但是簡潔方便了很多。
因為 requests 已經(jīng)幫你處理了大部分情況误趴,所以你不需要考慮頁面的編碼問題霹琼。而且,requests 還通過 requests.Response 對象提供了一個更加靈活的接口來處理特殊情況。
使用 requirements.txt 需求文件
pip install 命令只會安裝最新發(fā)布的軟件包版本枣申,但是有時候售葡,你可能希望根據(jù)代碼運行情況安裝特定的版本。
你還希望在開發(fā)和測試時指定創(chuàng)建的依賴和版本忠藤,這樣就可以在生產(chǎn)環(huán)境避免應(yīng)用程序出現(xiàn)意外情況堤瘤。
需求文件可以精確指定需要安裝的軟件包和版本陆蟆。運行 pip help 你可以看到一個 freeze 命令,它會按照格式化輸出以已經(jīng)安裝的軟件包盒音。你可以使用這個命令祈匙,將輸出重定向到文件以生成一個需求文件:
freeze 命令將所有軟件包以及版本信息轉(zhuǎn)儲到標(biāo)準(zhǔn)輸出璧亚,所以你可以重定向這些輸出到文件中着帽。這樣就可以在其他系統(tǒng)中根據(jù)這個需求文件執(zhí)行精準(zhǔn)安裝。約定這個需求文件名為 requirements.txt祭芦,但是你也可以根據(jù)個人喜好命名筷笨。
如果你希望在其他系統(tǒng)中復(fù)制你的開發(fā)環(huán)境憔鬼,你可以運行 pip install 命令并用 -r 開關(guān)指定需求文件:
軟件包的版本會根據(jù) requirements.txt 所列出的進(jìn)行匹配:
你可以將 requirements.txt 文件提交到資源控制器轴或,這樣就可以使用它在其它機(jī)器上創(chuàng)建精準(zhǔn)匹配的環(huán)境了昌跌。
微調(diào)需求文件
軟件包及其依賴的版本可能會導(dǎo)致硬編碼問題,這是因為軟件包會針對 bug 以及安全修復(fù)進(jìn)行頻繁的更新照雁,而你可能希望在它們發(fā)布后立即做出更改蚕愤。
需求文件的格式允許你使用邏輯運算符指定依賴的版本,這為確保更新包提供了更多的靈活性饺蚊,但是仍然要定義一個包的基礎(chǔ)版本萍诱。
使用你常用的編輯器并作以下修改:
你可以通過改變邏輯運算符為 >= 來告知 pip 精準(zhǔn)安裝已發(fā)布的指定版本或更高版本污呼。當(dāng)你使用 requirments.txt 設(shè)置了一個新的環(huán)境裕坊,pip 會查找滿足需求的最新版本并安裝。你可以使用帶有 --upgrade 開關(guān)的 install 命令來升級你需求文件中定義的軟件包:
這里沒有任何升級操作籍凝,因為你的軟件都是最新版本,但是如果在包列表中發(fā)布了新的版本苗缩,那么這個包就會被升級到最新版本饵蒂。
理想情況下,新版本的包會向后兼容并且沒有新引入的 bug酱讶。不幸的是退盯,新版本引入的更改還是可能會破壞你的應(yīng)用程序。需求文件的語法支持額外的版本說明符來微調(diào)你的需求。
比方說 requests 發(fā)布了新版本 3.0得问,但是有一些更改與你的應(yīng)用程序不兼容囤攀。你可以通過修改需求文件來禁止安裝 3.0 版本以及更高的版本:
更改 requests 的版本操作符可以確保不會安裝 3.0 或更高的版本宫纬。pip 的文檔提供了全部的需求文件格式焚挠,你可以查閱以了解更多相關(guān)信息。
生產(chǎn)與開發(fā)環(huán)境的依賴關(guān)系
你在開發(fā)期間安裝的依賴并不都是你的應(yīng)用程序的依賴漓骚。其中有很多發(fā)布到 PyPI 上的包蝌衔,是你開發(fā)過程中想用到的工具或庫。
比方說蝌蹂,你可能希望對你的應(yīng)用做單元測試噩斟,你需要單元測試的框架。一個流行的單元測試框架是 pytest孤个。你希望在你的開發(fā)環(huán)境中安裝它剃允,但是卻不希望在生產(chǎn)環(huán)境也安裝它,因為它不是應(yīng)用的依賴齐鲤。
這時你會創(chuàng)建第二個需求文件(requirements_dev.txt)來列出配置開發(fā)環(huán)境需要的工具:
這里需要你使用 pip 安裝兩個需求文件:requirements.txt 和 requirements_dev.txt。還好给郊,pip 允許在需求文件內(nèi)部指定一些額外的參數(shù)牡肉。你可以需改 requirements_dev.txt 文件支持同時安裝生產(chǎn)文件 requirements.txt 中的需求:
注意這里你使用了完全相同的 -r 開關(guān)來安裝生產(chǎn)文件 requirements.txt淆九。需求文件格式允許你在需求文件中指定其他參數(shù)统锤。
為生產(chǎn)環(huán)境凍結(jié)需求文件
你已經(jīng)創(chuàng)建了生產(chǎn)和開發(fā)環(huán)境的需求文件,并將它們添加到資源控制器中炭庙。這些文件可以靈活 的指定版本饲窿,可以通過發(fā)布的依賴進(jìn)行修復(fù) bug。你還可以測試你的應(yīng)用程序并為發(fā)布到生產(chǎn)環(huán)境做準(zhǔn)備焕蹄。
因為已經(jīng)知道開發(fā)環(huán)境應(yīng)用程序的所有測試已經(jīng)正常通過逾雄,所以你可能希望確保生產(chǎn)環(huán)境的依賴版本與整合管道或構(gòu)建過程中使用的完全相同。
目前的版本說明符并不能保證會在生產(chǎn)環(huán)境部署完全相同的版本擦盾,所以你需要凍結(jié)說明文件 嘲驾,像之前看到的那樣。
你創(chuàng)建了一個干凈的生產(chǎn)環(huán)境迹卢,并使用 requirements.txt 文件安裝了生產(chǎn)需求辽故。安裝完需求文件之后,你可以凍結(jié)當(dāng)前這個特定的版本腐碱,并將輸出轉(zhuǎn)儲到生產(chǎn)環(huán)境的 requirements_lock.txt 文件中誊垢。該 requirements_lock.txt 文件中包含精確的版本說明符掉弛,并且可以復(fù)制當(dāng)前環(huán)境。
搜索可用包
當(dāng)你擁有更多的 Python 經(jīng)驗之后喂走,會有一套熟悉的軟件包殃饿,并且可以用于大部分應(yīng)用程序。包 requesta 與 pytest 對于補充你的 Python 工具箱來說芋肠,都是很好的選擇乎芳。
有時你需要解決不同的問題,并想要找到一個可以幫助你解決問題的工具或庫帖池。上面提到奈惑,命令 pip help 展示了一個命令 search,可以搜索在 PyPI 上發(fā)布包睡汹。
我們看看這個命令有什么用:
這個命令給出了一組選項以及一個 參數(shù)囚巴。query 是一個用于搜索的字符串原在,可以匹配包名及描述。
注意:你可以使用 pip help 檢索其它支持的命令的信息彤叉。
假設(shè)你的應(yīng)用需要訪問一個使用 OAuth2 授權(quán)的服務(wù)庶柿。理想情況下,會有一個庫使用 requests 執(zhí)行或者其它類似的接口實現(xiàn)姆坚。用 pip 到 PyPI 上搜索一下:
search 命令選項生成了一個相當(dāng)大的包集合实愚。其中一些看起來像 django-oauth 這樣指定了一個服務(wù)或技術(shù)兼呵。希望找到一個像是 requests-oauth 的信息。很不幸腊敲,除了簡短的描述击喂,并沒有其它信息。
多數(shù)情況下碰辅,你希望直接在 PyPI 的網(wǎng)站搜索包懂昂。PyPI 為其索引提供了搜索功能,并通過包中公開的元數(shù)據(jù)(如框架没宾,主題凌彬,開發(fā)狀態(tài)等)過濾搜索結(jié)果。
PyPI 中用同一個術(shù)語搜索可能會產(chǎn)生大量的結(jié)果循衰,不過你可以對它們進(jìn)行分類過濾铲敛。比如,如果你想要找到可以幫助你開發(fā)應(yīng)用的庫会钝,你可以展開 Intended Audience 并選擇 Developers伐蒋。另外,你可能還需要一個穩(wěn)定且可用于生產(chǎn)的包,可以展開 Development Status 并選擇 Production/Stable先鱼。
你可以應(yīng)用其他過濾器以及調(diào)整搜索詞,直到找到你想要的包焙畔。
搜索結(jié)果提供了一個包頁面的鏈接掸读,包含了更多的信息以及想要的文檔。下面我們看看 requests-oauth2 的信息:
這個項目頁面提供了更多的信息寺枉,而且看起來還有一個指向 Home 頁的鏈接。該鏈接指向 Github 上的項目倉庫绷落。你可以看到項目相關(guān)的更多信息以及一些使用示例姥闪。
看到初始源代碼倉庫,像是找到了無價的財富砌烁。在那里筐喳,你可以通過查看最新的提交日志,PR(pull request)次數(shù)以及打開的 issues 等問題來找到一些項目的狀態(tài)和提示函喉。
另外還有一個查找包的方式避归,Google。被廣泛使用的 Python 庫會展示在 google 搜索的頂部管呵,并且你應(yīng)該能看到指向 PyPI 中包或者源代碼倉庫的鏈接梳毙。
找到一個合適包需要花費一些時間研究,但是只要找到了捐下,就可以為你的開發(fā)過程提速账锹。
卸載包
有時候你不得不卸載一個軟件包。要么是你找到了一個更好的包來替代它坷襟,要么是確實不需要某些功能了奸柬。卸載軟件包會有一些棘手。
注意這里婴程,當(dāng)你安裝了 requests廓奕,pip 同時也安裝了其他的依賴。你安裝的包越多档叔,多個包擁有相同的依賴的可能性越大桌粉。這里 pip 的 show 命令就派上用場了。
卸載包之前衙四,先確保你已經(jīng)對這個包運行了 show 命令:
[圖片上傳失敗...(image-63734b-1565242498214)]
注意最后的兩個屬性 Requires 和 Required-by铃肯。show 命令向我們展示了 requests 需要依賴 urllib3,certifi届搁,chardet 和 idna缘薛。你可能希望卸載其中的兩個窍育。而且你可以看到 requests 沒有被其他包引用,所以它可以安全地卸載宴胧。
你應(yīng)該對 requests 中所有的依賴都運行一下 show 命令漱抓,以確保沒有其他庫依賴它們。你了解了這些依賴次序之后恕齐,就可以使用 uninstall 命令來卸載它們乞娄。
卸載包會顯示將要刪除的文件并要求確認(rèn)显歧。如果你確認(rèn)要卸載這個包并且已經(jīng)檢查了它的依賴關(guān)系仪或,知道沒有其他包在使用這個包,那么可以使用 -y 開關(guān)來隱藏文件列表和確認(rèn)提示信息:
你可以一次調(diào)用指定所有你想卸載的包:
你還可以通過提供 -r 選項來刪除需求文件中列出的全部軟件包。這個命令會對每一個包都提示確認(rèn)信息拷肌,如果你已經(jīng)明確知曉你的操作到旦,可以通過 -y 開關(guān)禁止這些提示:
在你想要卸載包時巨缘,一直都要記得檢查一遍依賴項添忘。你可能希望卸載一個軟件包的所有依賴,不過如果有其它軟件包在使用這些依賴若锁,會導(dǎo)致程序崩潰搁骑。
pip 的替代品
pip 是所有 Pythonista 必備的基本工具,很多應(yīng)用程序和項目使用它作為軟件包管理器又固。本教程幫助你了解基礎(chǔ)知識仲器,而 Python 社區(qū)非常積極的為其它開發(fā)人員提供了很棒的工具和庫。其中包括 pip 的替代品口予,期望實現(xiàn)簡單高效的包管理娄周。
在本節(jié)涕侈,你將了解到 Python 中其它可用的包管理工具沪停。
萬能的 Conda
Conda 是一個包括 Python 在內(nèi)的多種語言的包、依賴及環(huán)境管理器裳涛。實際上木张,它最早來源于 Anaconda,作為 Python 中研究數(shù)據(jù)科學(xué)的包出現(xiàn)端三。
Conda 廣泛用于數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)應(yīng)用程序舷礼,并使用自己的索引來托管兼容的軟件包。
Conda 不僅可以管理包的依賴項郊闯,還可以管理應(yīng)用的虛擬環(huán)境妻献,安裝兼容并存的 Python 版本蛛株,為生產(chǎn)部署打包應(yīng)用。
在 Windows 系統(tǒng)上為機(jī)器學(xué)習(xí)設(shè)置 Python 很好的介紹了 Conda育拨,它探討了包和環(huán)境管理谨履。唯一與 Windows 相關(guān)的特定信息是安裝,因此如果你使用的是其他系統(tǒng)平臺熬丧,它仍然是可信的笋粟。
Pipenv
Pipenv 是另外一種包管理工具,旨在為 Python “提供全世界最好的包”析蝴。由于將虛擬環(huán)境與包管理合并到一個工具中害捕,pipenv 在 Python 社區(qū)獲得了極大的關(guān)注。
它還解決了在使用 pip 手動管理依賴關(guān)系是遇到的一些常見問題闷畸,比如尝盼,包的版本,隔離開發(fā)與生產(chǎn)環(huán)境依賴佑菩,鎖定生產(chǎn)環(huán)境版本等东涡。
Pipenv:新的 Python 打包工具指南是一份很好的學(xué)習(xí) Pipenv 及其包管理的入門材料。盡管這篇文章的標(biāo)簽是中級倘待,但是作者對讀者做了很好的引導(dǎo)疮跑,初學(xué) Python 的人也能理解這篇文章。
Poetry
Poetry 是另一個受到大量關(guān)注的 pip 替代品凸舵。與 Pipenv 類似祖娘,它簡化了包的版本管理并隔離了開發(fā)環(huán)境與生產(chǎn)環(huán)境的依賴,而且它將依賴隔離到一個虛擬環(huán)境中運行啊奄。
如果你已經(jīng)了解 JavaScript 和 npm渐苏,會覺得 Poetry 非常熟悉。它不只是管理包菇夸,還可以幫助你為應(yīng)用和庫構(gòu)建發(fā)行版本并部署到 PyPI琼富。如何向 PyPI 發(fā)布一個開源的 Python 包中一個很棒的 Poetry 介紹可以幫你入門。
總結(jié):什么是 pip庄新?
本教程回答了問題:什么是 pip鞠眉?你現(xiàn)在已經(jīng)知道,pip 是 Python 的包管理器择诈,被很多項目用于依賴管理⌒堤#現(xiàn)在 Python 安裝器已經(jīng)包含了 pip,使它成為所有的 Pythonista 都應(yīng)當(dāng)會用的基礎(chǔ)工具羞芍。
Python 提供了一個適用于開發(fā)各種應(yīng)用的標(biāo)準(zhǔn)庫擴(kuò)展哗戈,但是 Python 活躍的社區(qū)提供了更多的工具和庫,可以加速 Python 應(yīng)用開發(fā)荷科。
這些工具和庫都發(fā)布在 Python 包索引(PyPI)上唯咬,并且使用 pip 允許開發(fā)者在自己的環(huán)境中安裝它們纱注。
通過這篇教程,你可以學(xué)到:
1. 在命令行使用 pip 以及需求文件安裝新的軟件包
2. 管理依賴胆胰,隔離開發(fā)與生產(chǎn)環(huán)境奈附,以及創(chuàng)建一個鎖定的需求文件
3. 通過 pip 和 PyPI 查找包
4. 在卸載包之前評估包依賴,以及如何卸載包此外煮剧,你已經(jīng)了解到保持依賴處于最新的重要性斥滤,而且,pip 的很多替代品可以幫你管理這些依賴勉盅。
如果你有任何問題佑颇,可以隨時在下面的評論部分留言,你還可以隨時在 pip 文檔頁面獲取更多信息草娜。
英文原文:https://realpython.com/what-is-pip/譯者:敦偉
注:我這有個學(xué)習(xí)Python基地挑胸,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895817687