使用者指南

執行 pip

pip 是命令列程式。安裝 pip 後,會將 pip 指令加入系統中,並可從命令提示字元執行,方法如下

python -m pip <pip arguments>

python -m pip 會使用您指定為 python 的 Python 詮譯器執行 pip。因此,/usr/bin/python3.7 -m pip 表示您正在為位於 /usr/bin/python3.7 的詮譯器執行 pip。

py -m pip <pip arguments>

py -m pip 會使用您安裝的最新 Python 詮譯器執行 pip。如需更多詳細資料,請拜訪 Python Windows 啟動器 文件。

安裝套件

pip 支援從 PyPI、版本控制、本機專案和發行檔案直接進行安裝。

最常見的情況是使用 需求規格PyPI 進行安裝

python -m pip install SomePackage            # latest version
python -m pip install SomePackage==1.0.4     # specific version
python -m pip install 'SomePackage>=1.0.4'     # minimum version
py -m pip install SomePackage            # latest version
py -m pip install SomePackage==1.0.4     # specific version
py -m pip install 'SomePackage>=1.0.4'   # minimum version

如需更多資訊和範例,請參閱 pip install 說明。

基本驗證憑證

此問題現已在 驗證 一文中獲得說明。

netrc 支援

此問題現已在 驗證 一文中獲得說明。

鑰匙圈支援

此問題現已在 驗證 一文中獲得說明。

使用代理伺服器

PyPI 安裝套件時,pip 需要網際網路存取權,在許多公司環境中,這需要提供一個可外送的 HTTP 代理伺服器。

可以透過各種方式設定 pip 以連上代理伺服器

  • 使用 --proxy 命令列選項來指定代理伺服器,格式為 scheme://[user:passwd@]proxy.server:port

  • 組態檔案 中使用 proxy

  • 藉由設定標準環境變數 http_proxyhttps_proxyno_proxy

  • 使用環境變數 PIP_USER_AGENT_USER_DATA 以將 JSON 編碼字串包含在 pip 要求中使用之使用者代理程式變數中。

需求檔案

「需求檔案」是包含以 pip install 安裝項目清單的檔案,其使用方式如下

python -m pip install -r requirements.txt
py -m pip install -r requirements.txt

檔案格式詳細資訊在此處:需求檔案格式

若從邏輯上來看,需求檔案只是一個 pip install 引數清單,放置在一個檔案中。請注意,你不能依賴 pip 以特定順序安裝檔案中的項目。

需求檔案也可以透過網址提供服務,例如 http://example.com/requirements.txt(除了作為本機檔案之外),以便它們能儲存在集中位置並提供服務。

實際上,需求檔案有 4 個常見用途

  1. 需求檔案用於儲存 pip freeze 的結果,以取得 可重複安裝。在此情況下,你的需求檔案包含於執行 pip freeze 時已安裝之所有項目的固定版本。

    python -m pip freeze > requirements.txt
    python -m pip install -r requirements.txt
    
    py -m pip freeze > requirements.txt
    py -m pip install -r requirements.txt
    
  2. 需求檔案用於強制 pip 正確解析相依性。pip 20.2 及更早版本 沒有真實的相依性解析,而僅使用其為某專案找到的第一個規格。例如,如果 pkg1 需要 pkg3>=1.0pkg2 需要 pkg3>=1.0,<=2.0,且如果 pkg1 先得到解析,pip 將僅使用 pkg3>=1.0,而且很可能最終會安裝一個 pkg3 版本,而該版本與 pkg2 的需求有衝突。為了解決此問題,你可以將 pkg3>=1.0,<=2.0(即正確規格)連同其他頂層需求直接放入你的需求檔案中。其使用方式如下

    pkg1
    pkg2
    pkg3>=1.0,<=2.0
    
  3. 需求檔被用來強制 pip 安裝子依賴項的其他版本。例如,假設您的需求檔中的 ProjectA membutuhkan ProjectB,但最新版本 (v1.3) 有漏洞,您可以強制 pip 接受較早版本如下

    ProjectA
    ProjectB<1.3
    
  4. 需求檔被用來以存在於版本控制中的區域修補程式覆寫依賴項。例如,假設 PyPI 中的依賴項 SomeDependency 有漏洞,而且您無法等待上游修正。您可以複製/複製原始程式碼,修正它並使用標籤 sometag 將它置於 VCS 中。您使用類似以下行的方式在您的需求檔中參照它

    git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency
    

    如果 SomeDependency 以前是您的需求檔中的頂層需求,那麼取代該行為新行。如果 SomeDependency 是子依賴項,那麼加入新行。

清楚瞭解 pip 使用 install_requires metadata,而不是透過發現專案中嵌入的 requirements.txt 檔來決定套件依賴項非常重要。

另請參閱

限制檔

限制檔是需求檔,它們僅能控制安裝哪個版本的需求,而不能控制是否安裝。它的語法和內容是 需求檔 的子集,其中不允许幾種語法:限制檔必須有名稱,它們不能是可編輯的,它們不能指定額外元件。在語義方面,有一個關鍵差異:在限制檔中包含套件不會觸發套件安裝。

如下列方式使用限制檔

python -m pip install -c constraints.txt
py -m pip install -c constraints.txt

當您不知道要安裝哪些東西時,限制檔的使用原因與需求檔完全相同。例如,假設「helloworld」套件在您的環境中無法使用,因此您有一個區域修補版本。您安裝的一些東西依賴於「helloworld」,而另一些則不依賴。

確保一致使用修補版本的一種方法是手動稽核您安裝的所有內容的依賴項,如果存在「helloworld」,請編寫一個需求檔在安裝該內容時使用。

限制檔提供了更好的方式:為您的組織撰寫一個限制檔,然後在各處使用它。如果正在安裝的內容需要安裝「helloworld」,您的限制檔中指定的固定版本會被使用。

在 pip 7.1 中增加了約束檔案支援。<在 20.3 版本(2020 年)中,pip 依賴項解析器的變更 一文中,我們對前一版本的執行方式進行了相當徹底的檢查,移除了幾個未記載也未支援的怪癖,並將約束檔案簡化為用來設定套件的 (版本) 全域限制方式。

與需求檔案相同,約束檔案也可以透過 URL 提供,例如 http://example.com/constraints.txt,讓您的組織可以集中儲存並提供這些檔案。

從輪子安裝

「輪子」是一種建構的封存格式,與根據原始檔封存內容建構並安裝相比,可以大幅縮短安裝時間。有關更詳細的資訊,請參閱 規範

pip 會優先使用可用的輪子。若要停用此功能,請使用 --no-binary 旗標來執行 pip install

如果找不到適當的輪子,pip 會預設尋找原始檔封存內容。

直接從輪子封存安裝

python -m pip install SomePackage-1.0-py2.py3-none-any.whl
py -m pip install SomePackage-1.0-py2.py3-none-any.whl

若要安裝輪子中 provides_extras 元資料提供的選用依賴項,您必須在安裝目標名稱周圍加上引號

python -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'
py -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'

注意事項

未來,path[extras] 語法可能會淘汰。建議隨處都使用 標準 語法。

在沒有提供輪子版本的情況下,pip 提供 pip wheel 做為方便的工具,來為您的所有需求與依賴項建構輪子。

pip wheel 需要安裝 wheel 套件,才能提供它所使用的「bdist_wheel」setuptools 擴充功能。

為您的需求與所有依賴項建構輪子,並儲存在本機目錄中

python -m pip install wheel
python -m pip wheel --wheel-dir=/local/wheels -r requirements.txt
py -m pip install wheel
py -m pip wheel --wheel-dir=/local/wheels -r requirements.txt

然後再僅使用輪子的本機目錄來安裝這些需求(不從 PyPI 安裝)

python -m pip install --no-index --find-links=/local/wheels -r requirements.txt
py -m pip install --no-index --find-links=/local/wheels -r requirements.txt

解除套件安裝

pip 能夠解除安裝大部分的套件,如下所示

python -m pip uninstall SomePackage
py -m pip uninstall SomePackage

在升級至較新的版本之前,pip 也會自動解除安裝套件的舊版本。

有關更多資訊和範例,請參閱 pip uninstall 參考。

列出套件

列出已安裝的套件

$ python -m pip list
docutils (0.9.1)
Jinja2 (2.6)
Pygments (1.5)
Sphinx (1.1.2)
C:\> py -m pip list
docutils (0.9.1)
Jinja2 (2.6)
Pygments (1.5)
Sphinx (1.1.2)

列舉過期套件,並顯示最新的可用版本

$ python -m pip list --outdated
docutils (Current: 0.9.1 Latest: 0.10)
Sphinx (Current: 1.1.2 Latest: 1.1.3)
C:\> py -m pip list --outdated
docutils (Current: 0.9.1 Latest: 0.10)
Sphinx (Current: 1.1.2 Latest: 1.1.3)

顯示已安裝套件的詳細資料

$ python -m pip show sphinx
---
Name: Sphinx
Version: 1.1.3
Location: /my/env/lib/pythonx.x/site-packages
Requires: Pygments, Jinja2, docutils
C:\> py -m pip show sphinx
---
Name: Sphinx
Version: 1.1.3
Location: /my/env/lib/pythonx.x/site-packages
Requires: Pygments, Jinja2, docutils

更多資訊和範例,請參閱 pip listpip show 參考資料頁面。

搜尋套件

pip 可使用 pip search 指令從 PyPI 搜尋套件

python -m pip search "query"
py -m pip search "query"

查詢將用於搜尋所有套件的名稱與摘要。

更多資訊和範例,請參閱 pip search 參考資料。

組態

這個主題現在涵蓋在 設定中。

設定檔案

這個主題現在涵蓋在 設定中。

環境變數

這個主題現在涵蓋在 設定中。

設定優先順序

這個主題現在涵蓋在 設定中。

指令完成

pip 在 bash、zsh 和 fish 中支援指令列完成。

設定 bash

python -m pip completion --bash >> ~/.profile

設定 zsh

python -m pip completion --zsh >> ~/.zprofile

設定 fish

python -m pip completion --fish > ~/.config/fish/completions/pip.fish

設定 powershell

python -m pip completion --powershell | Out-File -Encoding default -Append $PROFILE

或者,你可以直接將 completion 指令的結果與 shell 的 eval 函數搭配使用,例如在啟動檔案中加入以下內容

eval "`pip completion --bash`"

從本機套件安裝

在某些情況下,你可能只想從本機套件安裝,而沒有 PyPI 流量。

首先,下載符合需求的壓縮檔

python -m pip download --destination-directory DIR -r requirements.txt
py -m pip download --destination-directory DIR -r requirements.txt

請注意,pip download 會先查看 wheel 快取,然後再嘗試從 PyPI 下載。如果你從未安裝過需求,你的 wheel 快取將不會有那些項目。在這種情況下,如果某些需求並非來自 PyPI 的 wheel,你又需要 wheel,那麼請執行以下指令

python -m pip wheel --wheel-dir DIR -r requirements.txt
py -m pip wheel --wheel-dir DIR -r requirements.txt

接著,只需使用 --find-links--no-index 從本機安裝,如下所示

python -m pip install --no-index --find-links=DIR -r requirements.txt
py -m pip install --no-index --find-links=DIR -r requirements.txt

「僅在需要時」遞迴升級

pip install --upgrade 現在有一個 --upgrade-strategy 選項,可用於控制 pip 如何處理相依項的升級。支援 2 種升級策略

  • eager:升級所有相依項,無關它們是否仍符合新的父層需求

  • 只有必要時:在 dependency 不符合新的父層需求時,才會進行升級

預設策略為 只有必要時。這項策略在 pip 10.0 中有所變更,主要是因為升級有衝突的 dependency 時,熱切 的本質易導致發生故障。

重要的是,您必須留意到 --upgrade 會影響直接需求 (例如,在命令列或需求檔案中指明),而 --upgrade-strategy 會影響間接需求 (直接需求的 dependency)。

以下是一個範例,假設 SomePackage 有個 dependency,SomeDependency,而這兩個套件都已經安裝,但是並非最新的版本

  • pip install SomePackage:不會升級現有的 SomePackageSomeDependency

  • pip install --upgrade SomePackage:會升級 SomePackage,但不會升級 SomeDependency(除非未符合最小需求)。

  • pip install --upgrade SomePackage --upgrade-strategy=eager:同時升級 SomePackageSomeDependency

做一個歷史註腳,早期獲得 只有必要時 行為的「修正」為

python -m pip install --upgrade --no-deps SomePackage
python -m pip install SomePackage
py -m pip install --upgrade --no-deps SomePackage
py -m pip install SomePackage

有提案建議採用 upgrade-all 命令,作為熱切升級行為的更安全替代方案。

使用者安裝

Python 2.6 開始採用安裝的「使用者方案」https://docs.python.org/3/install/index.html#alternate-installation-the-user-scheme,這表示所有 Python distribution 都支援針對使用者指定的替代安裝位置。每個作業系統的預設位置,可在 site.USER_BASE 變數的 python 文件中找到說明。這個安裝模式可透過向 pip install 指定 --user 選項來啟用。

此外,可以透過設定 PYTHONUSERBASE 環境變數自訂「使用者架構」,它會更新 site.USER_BASE 的值。

若要將「SomePackage」安裝至環境中 site.USER_BASE 已自訂為「/myappenv」,請執行下列操作

export PYTHONUSERBASE=/myappenv
python -m pip install --user SomePackage
set PYTHONUSERBASE=c:/myappenv
py -m pip install --user SomePackage

pip install --user 依循四項規則

  1. 當已在 Python 路徑上安裝的套件為 **相衝突** 安裝需求時,系統會忽略這些套件,**不** 會解除安裝。

  2. 當已在 Python 路徑上安裝的套件為 **滿足** 安裝需求時,pip 什麼都不會做,並報告需求已滿足(類似於在 --system-site-packages 虛擬環境中安裝套件時,全球套件如何滿足需求)。

  3. pip **不會** 在 --no-site-packages 虛擬環境中執行 --user 安裝(亦即為預設虛擬環境類型),原因是使用者網站不在 Python 路徑上。安裝將毫無意義。

  4. --system-site-packages 虛擬環境中,pip **不會** 安裝與虛擬環境 site-packages 中套件相衝突的套件。-user 安裝將缺乏 sys.path 優先順序,並毫無意義。

為使規則更明瞭,以下提供一些範例

--no-site-packages 虛擬環境中(亦即為預設類型)

$ python -m pip install --user SomePackage
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
C:\> py -m pip install --user SomePackage
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.

--system-site-packages 虛擬環境中,其中 SomePackage==0.3 已安裝在虛擬環境中

$ python -m pip install --user SomePackage==0.4
Will not install to the user site because it will lack sys.path precedence
C:\> py -m pip install --user SomePackage==0.4
Will not install to the user site because it will lack sys.path precedence

在真正的 Python 中,其中 SomePackage **未** 全球安裝

$ python -m pip install --user SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Successfully installed SomePackage

在真正的 Python 中,其中 SomePackage **已** 全球安裝,但是 **不是** 最新版本

$ python -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
$ python -m pip install --user --upgrade SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
C:\> py -m pip install --user --upgrade SomePackage
[...]
Successfully installed SomePackage

在真正的 Python 中,其中 SomePackage **已** 全球安裝,並且為最新版本

$ python -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
$ python -m pip install --user --upgrade SomePackage
[...]
Requirement already up-to-date: SomePackage
# force the install
$ python -m pip install --user --ignore-installed SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
C:\> py -m pip install --user --upgrade SomePackage
[...]
Requirement already up-to-date: SomePackage
# force the install
C:\> py -m pip install --user --ignore-installed SomePackage
[...]
Successfully installed SomePackage

確保重複性

這現在在 可重複安裝 中涵蓋。

修正衝突相依性

這現在在 依賴項解析度 中涵蓋。

在程式中使用 pip

如先前所述,pip 是命令列程式。它雖然是在 Python 中實作,因此可透過 import pip 從 Python 程式存取,但是您**不得**如此使用 pip 的內部 API。這樣做的原因有很多

  1. pip 程式碼假設它完全控制了這個程式的全域狀態。pip 管理某些事物,像是日誌系統設定,或標準 IO 串流的值,而且並沒有考慮到使用者程式碼可能會受到影響的可能性。

  2. pip 的程式碼不是執行緒安全的。如果您在執行緒中執行 pip,沒有任何保證您的程式碼或 pip 的程式碼可以按照您的預期運作。

  3. pip 假設一旦它完成工作,這個程序就會終止。它不需要處理這個點之後的其他程式碼會持續執行的可能性,所以(例如)在相同程序中呼叫 pip 兩次可能會產生問題。

這並不表示 pip 的開發者反對將 pip 作為函式庫使用的概念,只是這並非它撰寫的方式,而且要將內部重新設計成可用於函式庫會需要大量工作,處理上述所有問題,然後設計一個可用、穩健且穩定的 API,我們可以保證它可以在多個 pip 版本中持續使用。而我們目前根本沒有資源來考量這樣的任務。

這在實際上表示,pip 內部所有內容都被視為實作細節。即使是 import 名稱 pip 也可能會在未經通知的情況下變更。儘管我們會盡量不要破壞事物,所有內部 API 都可能在任何時候基於任何原因變更。這也表示,我們通常不會修復因為以不受支援的方式使用 pip 而產生的問題。

也應該注意,在正在執行的 Python 程序中將套件安裝進 sys.path 中是只能在審慎考量下才應該進行的操作。import 系統快取某些資料,而在程式正在執行的過程中安裝新套件可能不會總是按照預期表現。實際上,很少會出問題,但這仍是需要留意的問題。

儘管說了上述所有內容,如果決定要從程式中執行 pip,仍有必要介紹可用的選項。最可靠的做法,也是完全受支援的做法,是在子程序中執行 pip。這可以使用標準 subprocess 模組輕鬆完成。

subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])

如果您想要進一步處理輸出,請使用模組中的其他 API 之一。我們在此使用 freeze,它會以需求的格式輸出已安裝的套件。

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])

如要以程式的方式監控下載進度,請使用 --progress-bar=raw 選項。這會以 Progress CURRENT of TOTAL 格式將多行印到標準輸出,其中 CURRENTTOTAL 是整數,單位為位元組。如果不知道實際總數,則 TOTAL 會設為 0。請注意,pip 輸出的特定格式在後續版本中並非保證相同。

如果你不想使用 pip 的指令列功能,而是想要實作可與 Python 套件、其元資料或 PyPI 搭配運作的程式碼,那麼你應該考慮其他提供這種功能的受支援套件。以下是你可以考慮的一些範例:

  • packaging - 處理標準套件元資料(版本、需求條件等)的公用程式

  • setuptools(特別是 pkg_resources) - 查詢使用者在其系統中已安裝哪些套件的函式。

  • distlib - 套件和發行公用程式(包括與 PyPI 互動的函式)。

pip 相依性解析器在 2020 年的 20.3 版本中的變更

pip 20.3 具備新的相依性解析器,Python 3 使用者的預設值已啟用。(pip 20.1 和 20.2 已包含新相依性解析器的預先推出的版本,並隱藏在使用者選項標幟之後。)請閱讀以下的遷移指南、如何呼叫舊版解析器以及淘汰時程。我們也製作了一個 兩分鐘影片說明,你可以看看。

我們會持續改善 pip 相依性解析器,根據測試人員意見回饋進行調整。請透過 resolver 測試調查 提供意見回饋。

注意

此次推出的主要變更在於 pip 中的 pip 相依性解析器。

電腦需要知道正確的軟體安裝順序(要「安裝 x,就必須先安裝 y」)。因此,當 Python 程式設計師以套件的方式分享軟體時,他們必須精確描述這些安裝前提條件,而 pip 則需要解決各種取得對立指令的棘手情況。這個新的相依性解析器將讓 pip 能夠更妥善處理複雜邏輯,並且讓 pip 更容易使用與進行問題排除。

解析器的最重要變更如下:

  • 它將減少不一致性:它將不再安裝對彼此會相互不一致的套件組合。在早期版本的 pip 中,pip 可能會安裝一個套件而它不符合另一個已安裝套件所宣稱的需求。例如,在 pip 20.0 中,pip install "six<1.12" "virtualenv==20.0.2" 做錯了事,讓 six==1.11 「成功地」安裝,儘管 virtualenv==20.0.2 需要 six>=1.12.0,<2在此處定義)。新解譯程式則徹底拒絕在得到這樣的輸入時安裝任何東西。

  • 它將會更嚴格,如果您要求 pip 安裝兩個需求不相容的套件,它將會拒絕(而不是像以前版本一樣安裝一個有問題的組合)。

因此,如果您一直在使用替代途徑來強制 pip 因應不兼容或不一致的需求組合,現在是時候修復套件中的底層問題了,因為 pip 從今以後將會更加嚴格。

這也表示,當您執行 pip install 指令時,pip 只會考量您在該指令中安裝的套件,而且可能會損毀已安裝的套件 。它不會保證您的環境始終一致。如果您 pip install x,然後 pip install y,您取得的 y 版本可能與您在單一指令中執行 pip install x y 時得到的版本不同。我們正在考慮變更此行為(依照 #7744),並希望獲得您對於 pip 行為應有的看法;請回答 我們關於會造成衝突的升級的調查

我們也正在變更我們對 約束檔案、可編輯的安裝,以及相關功能的支持。我們做了相當全面的修正,並將約束檔案簡化為純粹是用於指定套件的全局(版本)限制,因此以前允許的一些組合現在將導致錯誤。具體來說,

  • 約束不推翻既有需求,它們仅仅約束了哪些版本會顯示在解析器的輸入項目(請參閱 #9020

  • 提供可編輯的需求(-e .)並不會導致 pip 忽略版本規格符或約束(請參閱 #8076),若固定需求與本機目錄之間存在衝突,pip 將表明其找不到滿足二者的版本(請參閱 #8307

  • 雜湊檢查模式要求所有需求都以 == 指定版本比對,且可能無法與約束很好地結合(請參閱 #9020#8792

  • 若有必要滿足約束,pip 將很樂意重新安裝套件,升級或降級,無需任何其他指令列選項(請參閱 #8115控制安裝程序的選項

  • 不允許使用未命名需求作為約束(請參閱 #6628#8210

  • 不允許使用連結作為約束(請參閱 #8253

  • 約束不得具有額外功能(請參閱 #6628

根據我們的 Python 2 支援 政策,正在使用 Python 2 的 pip 20.3 使用者將預設使用舊有解析器。Python 2 使用者應儘快升級至 Python 3,因為 pip 在 2021 年 1 月的 21.0 版本中已完全終止支援 Python 2。

如何升級和遷移

  1. 透過 python -m pip install --upgrade pip 安裝 pip 20.3。

  2. 透過執行 pip check 驗證目前環境。這樣會報告安裝套件組中是否有任何不一致的地方。執行乾淨的安裝會大大降低在新解析器中碰到問題的可能性(且可能解決目前環境的隱藏問題!)。若執行 pip check 並且遇到無法理解的問題,請 在我們的問題追蹤器或聊天中尋求協助

  3. 測試新版本的 pip.

    雖然我們已盡量確保 pip 的測試套件能涵蓋儘可能多的案例,但我們非常清楚有許多人使用具備各式工作流程和建置程式的 pip,且我們無法在未經協助的情況下涵蓋所有情況。

    • 如果您使用 pip 安裝軟體,請嘗試新的解析器,並用 pip install 讓它為您運作。嘗試

      • 同時安裝多個套件

      • 使用 requirements.txt 檔案重新建立環境

      • 使用 pip install --force-reinstall 檢查它是否符合預期執行

      • 使用限制檔案

      • 以下「需要特別注意的設定」和「嘗試範例」

    • 如果您具有仰賴 pip 安裝相依套件的建置管線,請檢查新的解析器是否符合您的需求。

    • 使用新的解析器執行專案的 CI(測試套件、建置程式等),並讓我們知道任何問題。

    • 如果您過去曾遭遇 pip 的解析裝置問題,請檢查新的解析器是否能解決這些問題,並閱讀 處理相依衝突。另外,請讓我們知道新的解析器是否對您為了解決目前解析器限制所執行的任何因應措施造成問題。我們必須確保大家能順利地放棄這些因應措施。

    • 如果您開發或支援包裝 pip 或使用 pip 提供部份功能性的工具,請測試您的整合在 pip 20.3 中的運作狀態。

  4. 如有需要,請進行疑難排解並嘗試這些因應措施。

    • 如果 pip 安裝套件需要更長時間,請閱讀 相依解析回溯,以了解如何減少 pip 花在相依衝突回溯上的時間。

    • 如果您不希望 pip 真正解析相依套件,請使用 --no-deps 選項。當您擁有一組在實際上能一起運作的套件版本時,即使它們的元資料表示它們衝突時,這會很有幫助。如需長期修正的指引,請閱讀 處理相依衝突

    • 如果您遇到解析錯誤且需要在修正其根本原因的同時找到因應措施,您可以使用旗標 --use-deprecated=legacy-resolver 選擇舊的解析器行為。這將持續直到我們發布 pip 21.0,請參閱 停用時間表

  5. 請透過 解析函數測試問卷回報錯誤。

需要特別注意的測試設定

  • 包含 100 個以上套件的需要檔案

  • 包含多個需要檔案的安裝工作流程

  • 包含雜湊 (雜湊檢查模式) 或已釘選相依關係 (可能來自 pip-compile 內的 pip-tools 中的輸出) 的需要檔案

  • 使用 約束檔案

  • 持續整合/持續部署設定

  • 從任何一種版本控制系統 (例如 Git、Subversion、Mercurial 或 CVS) 安裝,詳細資訊請見 VCS 支援

  • 從儲存在本機資料夾中的原始碼安裝

嘗試範例

安裝

  • tensorflow

  • hacking

  • pycodestyle

  • pandas

  • tablib

  • elasticsearchrequests (同時)

  • sixcherrypy (同時)

  • pip install flake8-import-order==0.17.1 flake8==3.5.0 --use-feature=2020-resolver

  • pip install tornado==5.0 sprockets.http==1.5.0 --use-feature=2020-resolver

嘗試

  • pip install

  • pip uninstall

  • pip check

  • pip cache

告訴我們

我們很希望收到回饋的具體事項

  • 當然是新解析函數產生錯誤結果的狀況。我們希望這類狀況不會太多,但在我們移除舊版解析函數之前,我們希望找出這些錯誤。

  • 你認為解析函數應該可以找出執行方法,但卻產生錯誤的狀況。

  • 解析函數因為你的需求有問題而產生錯誤,但你需要更詳細資訊才能找出問題所在。

  • 如果你有方法解決目前解析函數遇到的問題,新的解析函數是否能讓你移除這些方法?請告訴我們!

請透過 解析函數測試問卷 讓我們知道。

棄用時程

我們規劃解析器轉換計劃中進行以下操作,使用 功能旗標,並遵循我們的 發佈節奏

  • pip 20.1:新解析器的 alpha 版本可用,可選擇加入,使用選用標記 --unstable-feature=resolver。pip 預設為舊版行為。

  • pip 20.2:新解析器的 beta 版本可用,可選擇加入,使用標記 --use-feature=2020-resolver。pip 預設為舊版行為。pip 20.2 使用者若想要 pip 預設使用新解析器,則可執行 pip config set global.use-feature 2020-resolver(有關該部分和其他 PIP_USE_FEATURE 環境變數選項的詳細資料,請參閱 問題 8661)。

  • pip 20.3:pip 在 Python 3 環境中預設為新解析器,但使用者可以選擇退出並選擇舊解析器行為,使用標記 --use-deprecated=legacy-resolver。在 Python 2 環境中,pip 預設為舊解析器,新解析器可用,且使用標記 --use-feature=2020-resolver

  • pip 21.0:pip 預設使用新解析器,不再支援舊解析器。一段時間後便會移除該解析器,但時間點目前未定,因為移除動作視 pip 的志工維護人員的可用性而定。根據我們的 Python 2 支援政策,會移除 Python 2 支援。

由於此工作不會變更 pip 文件中說明的可見使用者行為,因此此變更不受 淘汰政策 規範。

注意

舊解析器已過時且不再受支援。新功能(例如 安裝報告)無法與舊解析器搭配使用,此解析器將在未來版本中移除。

內容和後續動作

正如我們在 PSF 部落格的公告中所提,pip 團隊正在開發新的「依存關係解析器」(pip 中負責根據您的需求找出要安裝什麼內容的部分)。

我們在 #6536 追蹤我們的推出時程,你可以留意低流量套件公告清單 的公告官方的 Python 部落格

使用系統信賴商店驗證 HTTPS

現在可在 HTTPS 憑證 中找到這部分內容。