建置系統介面¶
在處理套件的可安裝原始碼發行版時,pip 沒有直接處理該套件的建置處理程序。這項職責委派給「建置後端」,也稱為「建置系統」。這意謂 pip 需要一個介面,才能與這些建置後端互動。
pip 使用兩個主要介面來進行這些互動
pyproject.toml
為基礎受標準支援的介面,具有明確的宣告和建置相依性的管理。
setup.py
為基礎舊版介面,我們正努力讓使用者不再使用它。沒有良好機制來宣告建置相依性。
各個介面的詳細資訊可以在其專用頁面中找到,如上所述連結。本文件涵蓋 pip 將為專案使用的建置系統介面周圍的細微差別,以及適用於 pip 可能使用的所有建置系統介面的詳細資訊。
判斷使用哪個建置系統介面¶
目前,如果存在 pyproject.toml
檔案,pip 則會使用 pyproject.toml
為基礎的建置系統介面。否則,則會使用舊版建置系統介面。我們的目標是無條件地切換到使用 pyproject.toml
建置系統介面,並在未來的某個時間點停止支援舊版建置系統介面。
執行建置時,pip 會提及它正在使用的建置系統介面。通常會以如下訊息的形式呈現
Building wheel for pip (pyproject.toml)... done
Building wheel for pip (setup.py)... done
括弧中的內容,是指使用哪個建置系統介面。
在第 21.3 版中變更: 輸出使用「pyproject.toml」而非「PEP 517」來指稱為 pyproject.toml
為基礎的建置系統介面。
控制使用哪個建置系統介面¶
旗標 --use-pep517
(和對應環境變數:PIP_USE_PEP517
)可以用來強制所有套件使用 pyproject.toml
為基礎的建置系統介面來建置。沒有辦法強制使用舊版建置系統介面。
控制 setup_requires
¶
提示
這只適用於將 setuptools 用作建置後端且在 setup.py 檔案中使用 setup_requires
關鍵字引數的專案。
setup.py
中的 setup_requires
引數用於指定套件的建置時間相依性。這已被 pyproject.toml
檔案中的 build-system.requires
鍵所取代(根據 PEP 518)。不過,有時會遇到使用 setup_requires
的套件(例如:套件尚未更新為使用更新方法!)
如果您控制該套件,請考慮加入 pyproject.toml
檔案以使用現代建置系統介面。如此一來,即可避免透過委派 pip 進行安裝來觸發有問題的行為。
對於終端使用者而言,處理具備 setup_requires
的套件時,最好的解決方案事先安裝 setup_requires
中列出的套件,使用先前的 pip install
指令。這是因為無法控制 easy_install
如何找到這些相依性,或 setuptools 將如何使用 pip 的指令列選項呼叫 pip
,這使得以適當的方式運作變得困難。
如果您要確保 easy_install
呼叫不會接觸 PyPI,您需要使用 distutils
組態檔來組態其行為。以下是一些範例
讓相依性位於
easy_install
的備用索引中[easy_install] index_url = https://my.index-mirror.com
讓相依性從本機目錄中找到,而非爬取 PyPI,新增這個
[easy_install] allow_hosts = '' find_links = file:///path/to/local/archives/
歷史背景
setuptools < 52.0
將使用 easy_install
嘗試滿足 setup_requires
相依性,這可能導致奇怪的失敗 -- easy_install
無法理解許多現代 Python 封裝標準,而且通常會嘗試安裝不相容的套件版本或不正確地建置套件。它也會產生不適當的指令碼包裝,在許多情況下無法正常運作。
setuptools
的較新版本會使用 pip
進行這些安裝,但僅能傳遞有限的命令列引數。這也可能會導致奇怪的錯誤和細微不正確的行為。