The problem of Python's version dependent paths for packages
一件相當知名的關於 Python 的事實是,官方安裝套件的方式大多都會將它們放在包含 Python 系列版本(例如「3.13」而非「3.13.5」)的檔案系統路徑中。這適用於 site packages、`pip install --user`(只要它仍然可用),以及任何你使用虛擬環境的方法。不過,這也造成了一個問題:每次切換到新版本,例如從 3.12 升級到 3.13 時,你所有已安裝的套件都會消失(除非你保留舊版 Python 並持續使用它來維護虛擬環境等)。
一般來説,許多人都想升級到新的 Python 版本。Linux 發行版希望發佈最新的 Python(通常會),各種直接使用 Python 的用户也想要新功能,等等。但這些依賴於版本的路徑及其後果,使得升級變得更加痛苦,從而在某種程度上導致人們不那麼頻繁地進行升級。
在開始時,Python 至少有兩個理由需要使用這些版本相關的路徑。Python 無法保證其字節碼(以及由 .py 檔案產生的 .pyc 檔案)或其 C ABI(任何編譯套件依賴之處,在 Linux 上以 .so 形式存在)在不同版本之間保持穩定。Python 的標準安裝與字節碼處理曾經將兩者——字節碼檔和編譯檔——放置於同一目錄下,而不是分開存放。由於純 Python 套件可能依賴於編譯套件,將它們一起放置具有一定的邏輯性;若某個編譯套件因不相容的新 Python 版本而無法載入,你的純 Python 套件也可能因此失效。
(Python 字節碼檔案並非那麼緊密相連,因此在不久之前,Python 把它們搬到了一個「)
__pycache__
在子目錄中並給它們加上 Python 版本後綴,例如「<任意名稱>.cpython-312.pyc」。由於它們位於子目錄,當你刪除整個套件時,它們會自動被移除。
另一個問題是,即使是純粹的 Python 套件,也可能無法完全與新的 Python 版本相容(且通常絕對不適用於較舊的版本)。因此,升級到新版 Python 時,往往也需要更新套件,而不是僅使用目前已安裝的同一版本。
雖然我不喜歡目前的狀況,但我不知道 Python 能做什麼才能顯著改善。把 .py 檔(即純 Python 套件)放進一個與版本無關的目錄結構,在某些情況下會奏效(如果你只向前遞增 Python 版本,永不回退,可能會經常成功),但在其他時候卻會失敗,有時是明顯的原因(例如編譯好的套件無法匯入),有時則是微妙的問題(如果某個套件與新的 Python 版本不相容)。
(這也可能不與現有工具向後相容。)