注意

此文件的部分文件目前仍在編寫中。pip 的開發人員歡迎您提供協助,來完成此文件。如果您有興趣提供協助,請在 追蹤議題 中告訴我們。

廣泛功能概觀

pip 是套件安裝程式。

pip 不僅可以安裝套件,它還有快取、設定檔和 CLI,這些都有它們自己的特殊功能。但最主要的

pip 的功能

  1. 在必要的狀況下管理套件建置(委託給後端建置套件),(源頭發布套件 -- 如果套件是輪片的話就不用這麼做)。
    1. 基於向後相容性的原因,pip 預設將套件建置委託給 setuptools。但是 setuptools 有個特性:有一個 setup.py 檔案可呼叫來 ……. 取得資訊?
  2. 決定要將檔案安裝到哪裡。套件建置完成後,產生的成品就會安裝到系統中合適的位置。 PEP 517 定義建置後端與安裝程式的介面。

流程的廣泛概觀

pip 會依序執行哪些動作?

  1. 取得使用者輸入(使用者提供的字串,說明他們要哪個套件)

  2. 找出其中的意義:使用者要求的是什麼 -- 轉換成 pip 可以操作的東西(使用者輸入轉換成必要條件)

  3. 整個流程的核心,也許?一旦您透過步驟 2 有一組必要條件,您就必須將它們擴充成具體的「要安裝的檔案」 -- 找出基於使用者提供的必要條件,需要再安裝哪些其他必要條件,以及到哪裡取得這些必要條件。

    1. 這個步驟很複雜,也需要探索,包括相依性

      解析 -- 我們需要取得索引,查看有哪些版本可以使用

    2. 有時候您需要建置套件本身才能取得

      相依性資訊,這表示從套件索引中取得套件,表示需要知道這個套件是否存在。對於單一套件來說,

  4. 安裝實際要安裝的項目。

原因?pip 會從 PyPI 以外的地方安裝!但同時,我們以前從來無法保證 PyPI 的 JSON API,因此到目前為止,還沒有人可以從 PyPI 取得獨立於套件下載的元資料。

就安裝流程來說

  1. 針對一個套件:取得這個套件的抽象必要條件,並嘗試找出它的意義(這個抽象必要條件可以有各種形式)。定義抽象相依性。

  2. 一旦我們擁有一組「這個套件,從這裡取得,這個是這個套件那個版本」,

  3. 修改環境來安裝這些東西(意即:將檔案放入正確的位置)。例如:如果您已經有必要條件的 6.0 版,而且您正在安裝 7.2 版,請解除安裝 6.0 版並安裝 7.2 版。

下載流程

在安裝期間會發生什麼事?其中一個小步驟是 install,這是 pip 在 pip install 期間通常會執行的流程,也就是 download(使用者也可以使用 pip download 指令)。而我們會下載並檢查套件以取得清單。對於任何給定的套件名稱,我們需要知道可以使用哪些檔案和這些檔案的檔名。

pip 可以從 Python 套件儲存庫下載,在儲存庫中,套件儲存在結構化的格式中,因此類似 pip 的安裝程式可以找到這些套件。

PEP 503 定義了我們與 Python 套件儲存庫溝通的 API。

PyPI

如果我們在沒有其他引數的情況下執行 pip download somepackage,會發生什麼事?預設情況下,我們會查看 PyPI,pip 知道到這裡尋找更多資訊,以了解套件索引如何得知 somepackage 的資訊。

pip 然後會知道:可以使用哪些檔案和這些檔案的檔名。

換句話說

在尚未解決所有相依性之前,執行下列動作

  1. 依照 PEP 503 中定義的 API,從 http://{pypi_index}/simple/{package_name} 取得索引頁面。

  2. 分析頁面中的所有檔案連結。

  3. 從連結清單中選擇一個檔案進行下載。

  4. 從已下載的套件中萃取出其元資料。

  5. 根據元資料更新相依性樹。

套件索引會透過現有的 PyPI API,向 pip 提供該套件的檔案清單。這些檔案包含版本和其他一些資訊,有助於 pip 決定這是否為 pip 應該下載的內容。

pip 會從清單中選擇一個檔案進行下載。

它可能會返回並選擇另一個要下載的檔案。

當 pip 查看套件索引時,它查看的位置基本上只有一個連結。連結文字是檔案的名稱。

這是 PyPI Simple API(PyPI 有多個 API,其中一些已棄用)。pip 檢視 Simple API,最初記載於 PEP 503 中;packaging.python.org 提供 PyPA 規格,針對 Simple Repository API 提供更多詳細資料。

針對此套件名稱,這裡是可用檔案清單。

在其中尋找

  • 檔案名稱清單

  • 其他資訊

一旦獲得這些資訊,它會選取一個檔案並下載它。

(問題:如果我要 pip install flask,我想全部的檔案清單無法…不應該…嗎?我只想要 Flask…。為什麼我取得了全部的清單?

回答:這並非是每個檔案,而只是 Flask 的檔案。PyPI 上沒有可取得全部檔案的 API。她是用來取得 Flask 的全部檔案的。)