使用者如何理解 pip¶
問題¶
我們想要了解 pip 的使用者如何理解 pip 作為一個工具:他們認為 pip 是什麼,以及它做了什麼。
研究¶
為了掌握參與者對 pip 的心智模型與套件管理運作方式,我們向參與者詢問以下問題:
以你的話來說明 pip 是什麼
以你的話來說明當 pip 安裝軟體套件時會發生什麼事
以你的話來說明 Python 套件相依性是什麼
當我們談論心智模型時,所說的是「深層」或「淺層」心智模型。當使用者對某事物有深層心智模型時,表示他們有深入的理解,並具備很多細節;淺層模型則相反。
為了評估這些心智模型,確認它們是否符合 pip 和套件管理的實際情況,我們和維護人員合作,找出 1. pip 的行為和活動(18 個面向)和 2. 套件相依性的面向(13 個)、以及 Python 套件相依性是什麼(10 個)。接著我們根據這些面向評分參與者的答案。
結果¶
分析著重在 Python 經驗介於 2 年到 10 年之間的參與者上。
超過 90% 的參與者對 pip 的理解並不深入,他們對 pip 是什麼、它在安裝過程中會做什麼,以及一般套件管理的理解有限。然而,儘管參與者的理解程度低,只有 4 位參與者對 pip 是什麼及其功能有事實上的錯誤理解。
參與者對 pip 安裝過程中會發生什麼事有稍微深入一些的理解。最深入的答案包括已識別的面向中有 7 個。平均值是 3。答案集中在解決相依性、找出可能的套件名稱、下載資產和安裝套件上。
參與者對軟體相依性的理解也一樣是淺層的,最深入的答案包括已識別的面向中有 8 個。平均值是 3。答案集中在這個事實上:軟體相依性是程式碼再利用的結果,限制套件版本可以降低相依性衝突的可能性。
在此試算表中提供完整資料。
對「以你的話來說明 pip 是什麼」的回應¶
“pip 是用來管理 Python 套件的標準命令列工具。它有三個主要功能:(1) 從儲存庫(通常是 Pypi)取得並快取 Python 套件及和/或其相依關係,(2) 在 Python 路徑中建置(如果需要)並安裝 Python 套件(以及相關相依關係)到「site-package」位置,以及(3)卸載先前已安裝的套件(這部分是選用功能)。- 參與者 242608909(科學家,地球與大氣科學系教授,使用 Python 已有 7 - 10 年)
“Pip 是 Python 的套件管理系統。有點像 Linux 中的 apt,它可用於將公共或私人儲存庫中的套件安裝到呼叫 pip 命令的 Python 目前版本或環境中。”- 參與者 240364032(使用 Python 已有 7-10 年的專業軟體開發人員)
“pip 允許在你的環境中安裝/更新/移除 Python 函式庫。pip 管理函式庫。你需要其他的東西來管理你的環境。使用 pip 最簡單的方法是 pip install
package-name
我建議使用 requirements.txt 並在每次加入函式庫時執行 pip install -r requirements.txt。這樣可以避免在專案結束時忘記某個函式庫 :)”- 參與者 241178995(在軟體工程中擔任資料科學家)
“python 的 npm/cargo/opam…… 專用於 Python 函式庫和應用程式的套件管理員和生態系統”- 參與者 240306262(自學 Python 的創意藝術家和網路開發人員,使用 Python 已有 5-6 年)
“一個用於下載、安裝套件和解析相依關係的工具。我把它視為 Linux 世界中 yum、zypper 或 apt-get install 所在的同一個領域。”- 參與者 240306204(使用 Python 進行科學研究和資料分析已有 3 - 4 年)
“Pip 是一個主要用於 Python 社群安裝套件的工具。(在 Python 中,「套件」具有兩種不同的含義;它可以是包含模組和其它套件的
import
陳述式目標,或者可以表示具備可定義介面、可安裝以利重複使用的程式碼彙集。我在這裡指的是第二個含義。)Pip 的實作定義了套件在 Python 環境中安裝的含義。任何其他想在 Python 環境中安裝軟體的工具(例如 conda)都必須符合 Pip 的實作。”- 參與者 240313922(大學的電腦安全研究員,使用 Python 已有 7-10 年)
回應「用你自己的話,解釋當 pip 安裝軟體套件時會發生什麼情況」¶
“我想 pip 會在儲存庫(預設為 PyPI,但可以變更)中查詢套件「tea」。如果找不到,會產生錯誤。如果存在,它會下載有關套件的某些資訊,例如它的存在形式。它可以是 wheel 或需要建置的套件。如果是 wheel,它會檢查相依檔案並安裝它們,然後安裝 wheel(不確定這表示什麼,可能是解壓縮它)。wheel 特定於 python 發行版和基礎作業系統,因此它可能在某些平台上可用,但在另一些平台上則不可用。如果是需要建置的套件,pip 會下載套件來源(或複製儲存庫),並執行 setup.py(這會安裝相依檔案和其他套件),然後安裝套件本身。我忘了在安裝之前提一下會檢查所需版本與其他套件所需的版本的相容性。” - 參與者 240426799(科學研究人員 - 資料分析和電腦視覺模型,使用 Python 已 5-6 年)
“pip 會搜尋套件來源(對我而言,它使用預設值,也就是 Pypi),然後要求套件來源提供名稱和版本(如果指定)符合條件的套件,然後如果套件可用,它會以最合適的格式(取決於我的平台)下載套件,然後解壓縮套件和執行安裝程式(很可能使用隨附的 setup.py 檔案呼叫 setuptools),這會執行必要的安裝步驟。此安裝程序可能包含相依檔案(通常在 setup.py 中指定),這會觸發相依檔案相同的程序,並以此類推,直到安裝所有相依檔案(如果一切正常)。“ - 參與者 240670292(軟體開發人員工業系統控制,使用 Python 已 5-6 年)
「Pip 使用 PyPI(預設套件索引,假設未被覆寫)檢查與套件相符的
tea
。Pip 使用各種規格(例如:作業系統相容性、Python 相容性等)來尋找與我的系統相容的最新版本tea
。它在該版本中尋找最好的可能安裝相符選項(例如:一個輪子
,如果系統支援我的系統,我的pip
版本包含相關版本的支援 [例如:近期大多為 manylinux2010],可能會退回至原始程式碼散發版)。在下載相關散發版後,它會以setuptools.setup()
方法的install_requires
所指定的依賴性鏈向上遞迴執行相同的運算。在取得所有相關套件後,它會按照設定方法中指定的內容執行安裝──通常會將 python 檔案擷取到特定的系統路徑中,但依需要可以增加不同層級的複雜性,例如編譯、系統函式庫繫結等。我相信新的解析器會透過同時執行所有搜尋來變更上述內容(例如:藉由建立和解決依賴性圖表,而非逐漸巡覽)但我尚未閱讀 PEP 以深入了解。我以考量 setuptools的情況來回答上述問題──我相信最近已新增一個步驟,先檢查 pyproject.toml 以允許在此處進行其他系統的替代,但我發現新增的自訂化反而對生態體系而言是負面的,而且我還沒有用過它──整個 Poetry/Pipenv/Pipfile.lock/Flit 這件事情似乎只是增加不必要的複雜性而已;知道自己在做什麼的使用者早已在數年前為其套件解決了所有這些問題,而發現表層化能讓他們的生活更輕鬆的使用者無論表面上如何,可能會遇到 UX 問題。」- 參與者 241463652(使用 Python 5-6 年)
「pip 從 pypi 取得茶套件(猜測至少是在線上取得),並將檔案副本下載到我的本機 venv 中」- 參與者 243434435(資料分析和機器學習,使用 Python 1-2 年)
「從 pypi 查詢套件的最新版本」- 參與者 243897973(使用 Python 3 從事軟體測試/撰寫自動化測試 3-4 年)
「下載、解壓縮、偶爾為我的目標架構編譯模組」- 參與者 243428875(使用 Python 從事系統管理 7-10 年)
建議¶
很難知道該建議什麼。以下是部分想法
問題:使用者真的有必要知道 pip 所執行的所有動作嗎?
提供更好的文件
說明 pip 執行的「功能區塊」,以及當它發生中斷時如何處理這些功能區塊
策展套件管理員培訓和說明
改善 pip 輸出以公開各種 pip 功能性區塊