什麼是 pip ?pip 是 Python 中的標準庫管理器。它容許你安裝和管理不屬於 Python標準庫 的其它軟件包。本教程就是爲 Python 新手介紹 pip。
html
經過本教程,你將學到:python
1. 安裝 Python 的標準發行版中未包含的其餘軟件包web
2. 查找發佈於 Python 包索引(PyPI)的包npm
3. 管理腳本和應用程序的安裝需求django
4. 卸載包及它的相關依賴安全
如你所見,Python 社區很是活躍,而且爲 pip 建立了一些簡潔的替代方案,你能夠在本教程稍後的部分看到。服務器
那麼,什麼是 pip 呢?pip 是 Python 的包管理器。這意味着它是一個工具,容許你安裝和管理不屬於標準庫的其餘庫和依賴。框架
軟件包管理極其重要,因此自 Python3 的 3.4 版本以及 Python2 的 2.7.9 版本開始,pip 一直被直接包括在 Python 的安裝包內,一樣還被用於 Python 的其它項目中,這使得 pip 成爲了每個 Pythonista(Python用戶)必備的工具。機器學習
若是你已經瞭解了其餘語言,那麼可能會對包管理器的概念比較熟悉。JavaScript 使用 npm 管理軟件包,Ruby 使用 gem,以及 .NET 使用 NuGet。Python 中,則是 pip 做爲標準包管理器。編輯器
Python 的安裝器中自帶了 pip,因此你能夠直接使用它,除非你安裝的是更早版本的 Python。你能夠經過在控制檯中運行如下命令來驗證 pip 是否可用:
你應該能夠看到一個相似的輸出,顯示 pip 的版本以及安裝位置還有 Python 的版本。若是你使用的是不包含 pip 的舊版本 Python,你能夠根據 pip 安裝文檔中相應系統的說明進行安裝。
你可能但願在虛擬環境中使用本教程的示例,以免將包安裝到 Python 的全局安裝環境中。你能夠從 Python 虛擬環境:入門級瞭解虛擬環境相關的信息,這篇文章的」使用虛擬環境「一節介紹了建立虛擬環境的基礎知識。
Python 被認爲是一種"內置電池"式的語言。這表示 Python 標準庫包含大量的軟件包和模塊,這些模塊有助於開發人員開發腳本和應用。
與此同時,Python 擁有一個活躍的社區,它提供了一個更大的軟件包集合,以供你開發所需。這些軟件包發佈在 Python Package Index,也被稱爲 PyPI(發音 Pie Pea Eye)。PyPI 託管了大量包,包括開發框架,工具和庫。
其中不少軟件包經過爲已有功能提供了友好地接口來簡化 Python 開發。例如,你能夠寫一個腳本,僅使用 Python 標準庫中的功能分析網頁的內容:
腳本中,導入了 cgi 和 http.client,這兩個都是在 Python 的標準庫中。你建立了一個 HTTPSConnection 對象並指定服務器,而後調用 .request() 和 .getresponse() 解析響應信息。
從響應信息中,咱們解析到 Content-Type 頭信息而且使用 cgi 模塊提取頁面編碼的字符集。
cgi.parse_header() 返回一個包括主要值和字典做爲參數的元組。例如,Content-Type 頭信息可能包含一個像 text/html; charset=ISO-8859-1 的值。
這個元組將字符串 text/html 做爲第一個元素,第二個元素是 {'charset': 'ISO-8859-1'} 這樣形式的字典。由於你只須要關心 charset 參數,可使用下劃線忽略元組的開頭:_, params = cgi.parse_header(content_type)。
注意:Python 中下劃線的含義解釋瞭如何從元組解包值。
對頁面編碼後,你能夠閱讀相應信息並解碼到文本中。你能夠在控制檯中運行這個例子查看它是怎麼工做的:
對於一個用於解析網頁內容的小腳原本說,這看起來作的工做有點多。幸運的是,有一個 Python 的包能夠簡化 HTTP 請求並提供了一個友好地接口來實現你的指望。
PyPI 託管了一個很是流行的庫 requests 來完成 HTTP 請求。你能夠經過它的官方文檔站點了解全部的相關信息。
第一步是在你的環境中安裝 requests 包。你能夠運行 pip help 來了解 pip 支持的命令:
如你所見,pip 提供了 install 命令來安裝軟件包。你能夠運行它來安裝 requests 包:
你能夠看到與上面相似的輸出信息。你可使用 pip 以及 install 命令,其後跟着你想要安裝的包名。pip 會在 PyPI 中查找這個包,計算其依賴關係,安裝並確保 requests 正常工做。
你還能夠看到當前環境下 pip 的版本是 18.1,可是還有 19.0.1 版本可用。它還顯示了用於升級 pip 的命令,因此咱們來試一下:
注意這裏,你使用了 python -m 來升級 pip。-m 開關告訴 Python 將模塊做爲可執行文件運行。若是你要升級 pip,這麼作是頗有必要的,在安裝新的版本以前會卸載舊的版本,而當工具在運行時卸載它本身會致使錯誤。
當你將 pip 做爲一個模塊運行時,Python 會將模塊加載到內存中,並容許在這個模塊包運行的時候刪除它。若是軟件包提供了頂層腳本 __main__.py,那麼你能夠像運行腳本一下運行這個軟件包。
你已經安裝了 requests 並升級了 pip,如今可使用 list 命令查看你的環境中安裝了哪些軟件包。
如上所示,pip 已經升級到了 19.0.1 版本(目前最新版本),而且安裝了 requests 2.21.0 版本。
命令 pip install 會查找並安裝軟件包的最新版本。同時還會搜索軟件包元數據中的依賴列表,並安裝這些依賴以確保軟件包知足全部的需求。
這裏你能夠看到安裝了不少軟件。你可使用 pip 中的 show 命令查看包的元數據信息:
元數據中列出了依賴項 certifi,chardet,idna 和 urllib3,並且你能夠看到這些都已經安裝好了。
既然已經安裝了 requests 包,咱們能夠修改上面的例子,來看看如何更方便地解析網頁的內容:
由於你已經在開發環境中安裝了 requests 包,能夠像導入其餘標準庫同樣導入它。
能夠看到,requests.get() 處理了 HTTP 鏈接並返回一個與以前例子類似的響應,可是簡潔方便了不少。
由於 requests 已經幫你處理了大部分狀況,因此你不須要考慮頁面的編碼問題。並且,requests 還經過 requests.Response 對象提供了一個更加靈活的接口來處理特殊狀況。
pip install 命令只會安裝最新發布的軟件包版本,可是有時候,你可能但願根據代碼運行狀況安裝特定的版本。
你還但願在開發和測試時指定建立的依賴和版本,這樣就能夠在生產環境避免應用程序出現意外狀況。
需求文件能夠精確指定須要安裝的軟件包和版本。運行 pip help 你能夠看到一個 freeze 命令,它會按照格式化輸出以已經安裝的軟件包。你可使用這個命令,將輸出重定向到文件以生成一個需求文件:
freeze 命令將全部軟件包以及版本信息轉儲到標準輸出,因此你能夠重定向這些輸出到文件中。這樣就能夠在其餘系統中根據這個需求文件執行精準安裝。約定這個需求文件名爲 requirements.txt,可是你也能夠根據我的喜愛命名。
若是你但願在其餘系統中複製你的開發環境,你能夠運行 pip install 命令並用 -r 開關指定需求文件:
軟件包的版本會根據 requirements.txt 所列出的進行匹配:
你能夠將 requirements.txt 文件提交到資源控制器,這樣就可使用它在其它機器上建立精準匹配的環境了。
軟件包及其依賴的版本可能會致使硬編碼問題,這是由於軟件包會針對 bug 以及安全修復進行頻繁的更新,而你可能但願在它們發佈後當即作出更改。
需求文件的格式容許你使用邏輯運算符指定依賴的版本,這爲確保更新包提供了更多的靈活性,可是仍然要定義一個包的基礎版本。
使用你經常使用的編輯器並做如下修改:
你能夠經過改變邏輯運算符爲 >= 來告知 pip 精準安裝已發佈的指定版本或更高版本。當你使用 requirments.txt 設置了一個新的環境,pip 會查找知足需求的最新版本並安裝。你可使用帶有 --upgrade 開關的 install 命令來升級你需求文件中定義的軟件包:
這裏沒有任何升級操做,由於你的軟件都是最新版本,可是若是在包列表中發佈了新的版本,那麼這個包就會被升級到最新版本。
理想狀況下,新版本的包會向後兼容而且沒有新引入的 bug。不幸的是,新版本引入的更改仍是可能會破壞你的應用程序。需求文件的語法支持額外的版本說明符來微調你的需求。
比方說 requests 發佈了新版本 3.0,可是有一些更改與你的應用程序不兼容。你能夠經過修改需求文件來禁止安裝 3.0 版本以及更高的版本:
更改 requests 的版本操做符能夠確保不會安裝 3.0 或更高的版本。pip 的文檔提供了所有的需求文件格式,你能夠查閱以瞭解更多相關信息。
你在開發期間安裝的依賴並不都是你的應用程序的依賴。其中有不少發佈到 PyPI 上的包,是你開發過程當中想用到的工具或庫。
比方說,你可能但願對你的應用作單元測試,你須要單元測試的框架。一個流行的單元測試框架是pytest。你但願在你的開發環境中安裝它,可是卻不但願在生產環境也安裝它,由於它不是應用的依賴。
這時你會建立第二個需求文件(requirements_dev.txt)來列出配置開發環境須要的工具:
這裏須要你使用 pip 安裝兩個需求文件:requirements.txt 和 requirements_dev.txt。還好,pip 容許在需求文件內部指定一些額外的參數。你能夠需改 requirements_dev.txt 文件支持同時安裝生產文件 requirements.txt 中的需求:
注意這裏你使用了徹底相同的 -r 開關來安裝生產文件 requirements.txt。需求文件格式容許你在需求文件中指定其餘參數。
你已經建立了生產和開發環境的需求文件,並將它們添加到資源控制器中。這些文件能夠靈活 的指定版本,能夠經過發佈的依賴進行修復 bug。你還能夠測試你的應用程序併爲發佈到生產環境作準備。
由於已經知道開發環境應用程序的全部測試已經正常經過,因此你可能但願確保生產環境的依賴版本與整合管道或構建過程當中使用的徹底相同。
目前的版本說明符並不能保證會在生產環境部署徹底相同的版本,因此你須要凍結說明文件 ,像以前看到的那樣。
你建立了一個乾淨的生產環境,並使用 requirements.txt 文件安裝了生產需求。安裝完需求文件以後,你能夠凍結當前這個特定的版本,並將輸出轉儲到生產環境的 requirements_lock.txt 文件中。該 requirements_lock.txt 文件中包含精確的版本說明符,而且能夠複製當前環境。
當你擁有更多的 Python 經驗以後,會有一套熟悉的軟件包,而且能夠用於大部分應用程序。包 requesta 與 pytest 對於補充你的 Python 工具箱來講,都是很好的選擇。
有時你須要解決不一樣的問題,並想要找到一個能夠幫助你解決問題的工具或庫。上面提到,命令 pip help 展現了一個命令 search,能夠搜索在 PyPI 上發佈包。
咱們看看這個命令有什麼用:
這個命令給出了一組選項以及一個 參數。query 是一個用於搜索的字符串,能夠匹配包名及描述。
注意:你可使用 pip help 檢索其它支持的命令的信息。
假設你的應用須要訪問一個使用 OAuth2 受權的服務。理想狀況下,會有一個庫使用 requests 執行或者其它相似的接口實現。用 pip 到 PyPI 上搜索一下:
search 命令選項生成了一個至關大的包集合。其中一些看起來像 django-oauth 這樣指定了一個服務或技術。但願找到一個像是 requests-oauth 的信息。很不幸,除了簡短的描述,並無其它信息。
多數狀況下,你但願直接在 PyPI 的網站搜索包。PyPI 爲其索引提供了搜索功能,並經過包中公開的元數據(如框架,主題,開發狀態等)過濾搜索結果。
PyPI 中用同一個術語搜索可能會產生大量的結果,不過你能夠對它們進行分類過濾。好比,若是你想要找到能夠幫助你開發應用的庫,你能夠展開 Intended Audience 並選擇 Developers。另外,你可能還須要一個穩定且可用於生產的包,能夠展開 Development Status 並選擇 Production/Stable。
你能夠應用其餘過濾器以及調整搜索詞,直到找到你想要的包。
搜索結果提供了一個包頁面的連接,包含了更多的信息以及想要的文檔。下面咱們看看 requests-oauth2 的信息:
這個項目頁面提供了更多的信息,並且看起來還有一個指向 Home 頁的連接。該連接指向 Github 上的項目倉庫。你能夠看到項目相關的更多信息以及一些使用示例。
看到初始源代碼倉庫,像是找到了無價的財富。在那裏,你能夠經過查看最新的提交日誌,PR(pull request)次數以及打開的 issues 等問題來找到一些項目的狀態和提示。
另外還有一個查找包的方式,Google。被普遍使用的 Python 庫會展現在 google 搜索的頂部,而且你應該能看到指向 PyPI 中包或者源代碼倉庫的連接。
找到一個合適包須要花費一些時間研究,可是隻要找到了,就能夠爲你的開發過程提速。
有時候你不得不卸載一個軟件包。要麼是你找到了一個更好的包來替代它,要麼是確實不須要某些功能了。卸載軟件包會有一些棘手。
注意這裏,當你安裝了 requests,pip 同時也安裝了其餘的依賴。你安裝的包越多,多個包擁有相同的依賴的可能性越大。這裏 pip 的 show 命令就派上用場了。
卸載包以前,先確保你已經對這個包運行了 show 命令:
注意最後的兩個屬性 Requires 和 Required-by。show 命令向咱們展現了 requests 須要依賴 urllib3,certifi,chardet 和 idna。你可能但願卸載其中的兩個。並且你能夠看到 requests 沒有被其餘包引用,因此它能夠安全地卸載。
你應該對 requests 中全部的依賴都運行一下 show 命令,以確保沒有其餘庫依賴它們。你瞭解了這些依賴次序以後,就可使用 uninstall 命令來卸載它們。
卸載包會顯示將要刪除的文件並要求確認。若是你確認要卸載這個包而且已經檢查了它的依賴關係,知道沒有其餘包在使用這個包,那麼可使用 -y 開關來隱藏文件列表和確認提示信息:
你能夠一次調用指定全部你想卸載的包:
你還能夠經過提供 -r 選項來刪除需求文件中列出的所有軟件包。這個命令會對每個包都提示確認信息,若是你已經明確知曉你的操做,能夠經過 -y 開關禁止這些提示:
在你想要卸載包時,一直都要記得檢查一遍依賴項。你可能但願卸載一個軟件包的全部依賴,不過若是有其它軟件包在使用這些依賴,會致使程序崩潰。
pip 是全部 Pythonista 必備的基本工具,不少應用程序和項目使用它做爲軟件包管理器。本教程幫助你瞭解基礎知識,而 Python 社區很是積極的爲其它開發人員提供了很棒的工具和庫。其中包括 pip 的替代品,指望實現簡單高效的包管理。
在本節,你將瞭解到 Python 中其它可用的包管理工具。
Conda 是一個包括 Python 在內的多種語言的包、依賴及環境管理器。實際上,它最先來源於Anaconda,做爲 Python 中研究數據科學的包出現。
Conda 普遍用於數據科學和機器學習應用程序,並使用本身的索引來託管兼容的軟件包。
Conda 不只能夠管理包的依賴項,還能夠管理應用的虛擬環境,安裝兼容並存的 Python 版本,爲生產部署打包應用。
在 Windows 系統上爲機器學習設置 Python 很好的介紹了 Conda,它探討了包和環境管理。惟一與 Windows 相關的特定信息是安裝,所以若是你使用的是其餘系統平臺,它仍然是可信的。
Pipenv 是另一種包管理工具,旨在爲 Python 「提供全世界最好的包」。因爲將虛擬環境與包管理合併到一個工具中,pipenv 在 Python 社區得到了極大的關注。
它還解決了在使用 pip 手動管理依賴關係是遇到的一些常見問題,好比,包的版本,隔離開發與生產環境依賴,鎖定生產環境版本等。
Pipenv:新的 Python 打包工具指南是一份很好的學習 Pipenv 及其包管理的入門材料。儘管這篇文章的標籤是中級,可是做者對讀者作了很好的引導,初學 Python 的人也能理解這篇文章。
Poetry 是另外一個受到大量關注的 pip 替代品。與 Pipenv 相似,它簡化了包的版本管理並隔離了開發環境與生產環境的依賴,並且它將依賴隔離到一個虛擬環境中運行。
若是你已經瞭解 JavaScript 和 npm,會以爲 Poetry 很是熟悉。它不僅是管理包,還能夠幫助你爲應用和庫構建發行版本並部署到 PyPI。如何向 PyPI 發佈一個開源的 Python 包中一個很棒的 Poetry 介紹能夠幫你入門。
本教程回答了問題:什麼是 pip?你如今已經知道,pip 是 Python 的包管理器,被不少項目用於依賴管理。如今 Python 安裝器已經包含了 pip,使它成爲全部的 Pythonista 都應當會用的基礎工具。
Python 提供了一個適用於開發各類應用的標準庫擴展,可是 Python 活躍的社區提供了更多的工具和庫,能夠加速 Python 應用開發。
這些工具和庫都發布在 Python 包索引(PyPI)上,而且使用 pip 容許開發者在本身的環境中安裝它們。
經過這篇教程,你能夠學到:
1. 在命令行使用 pip 以及需求文件安裝新的軟件包
2. 管理依賴,隔離開發與生產環境,以及建立一個鎖定的需求文件
3. 經過 pip 和 PyPI 查找包
4. 在卸載包以前評估包依賴,以及如何卸載包此外,你已經瞭解到保持依賴處於最新的重要性,並且,pip 的不少替代品能夠幫你管理這些依賴。