Following system colour scheme - Python 增強提案 Selected dark colour scheme - Python 增強提案 Selected light colour scheme - Python 增強提案

Python 增強提案 (Python Enhancement Proposals)

PEP 370 – 使用者專屬 site-packages 目錄

作者:
Christian Heimes <christian at python.org>
狀態:
最終 (Final)
類型:
標準軌跡 (Standards Track)
建立日期:
2008年1月11日
Python 版本:
2.6, 3.0
公告歷史:


目錄

摘要

本 PEP 提議建立一個「使用者專屬 site-packages 目錄」,允許使用者在各自的主目錄(home directory)中進行 Python 套件的本地安裝。

原理

目前的 Python 版本缺乏統一的方法將套件安裝至使用者的主目錄中(Mac Framework 建置版本除外)。使用者往往被迫請求系統管理員協助安裝或更新套件,或必須使用多種替代方案,例如 Virtual Python [1]、Working Env [2] 或 Virtual Env [3]

本 PEP 的目標並非取代上述工具,也不是要實作 Python 的隔離安裝。它僅旨在為每個使用者實現最常見的應用場景:一個額外的 site-packages 目錄。

此功能無法單純透過環境變數 PYTHONPATH 實作。該環境變數僅會將新目錄插入 sys.path 的開頭,但不會解析目錄中的 pth 檔案。許多應用程式和 Python eggs 皆需要一個完整的 site-packages 路徑。

規範

站點目錄 (site-packages)

sys.path 中的一個目錄。與普通目錄不同的是,該目錄中的 pth 檔案也會被處理。

使用者站點目錄 (user site directory)

位於使用者主目錄內的一個站點目錄。使用者站點目錄專屬於特定的 Python 版本。其路徑包含版本號(僅含主版本號與次版本號)。
Unix(包含 Mac OS X)
~/.local/lib/python2.6/site-packages
Windows
%APPDATA%/Python/Python26/site-packages

使用者資料目錄 (user data directory)

通常為使用者站點目錄的父目錄。用於存放 Python 版本專屬的資料,如設定檔、文件、圖像與翻譯檔。
Unix(包含 Mac)
~/.local/lib/python2.6
Windows
%APPDATA%/Python/Python26

使用者基礎目錄 (user base directory)

位於使用者主目錄內。使用者站點目錄與使用者設定目錄皆位於此基礎目錄下。在某些系統上,該目錄可能會與第三方應用程式共用。
Unix(包含 Mac)
~/.local
Windows
%APPDATA%/Python

使用者腳本目錄 (user script directory)

用於放置二進位檔案與腳本的目錄。[10] 此目錄在不同 Python 版本間共用,並作為腳本安裝的目標目錄。
Unix(包含 Mac)
~/.local/bin
Windows
%APPDATA%/Python/Scripts

Windows 注意事項

在 Windows 上,選擇 Application Data 目錄(又稱 APPDATA)是因為它是存放應用程式資料最合適的位置。Microsoft 建議軟體不應寫入 USERPROFILE [5],而 My Documents 也不適合存放應用程式資料。[8] 此程式碼不會查詢 Win32 API,而是直接使用環境變數 %APPDATA%。

應用程式資料目錄是漫遊設定檔(roaming profile)的一部分。在有網域登入的網路環境中,應用程式資料可能會在中央伺服器與本地端之間同步,這可能會拖慢登入與登出速度。使用者可透過例如將 PYTHONUSERBASE 設定為「%HOMEDRIVE%%HOMEPATH%Applicata Data」等方式,將資料保留在伺服器上。使用者應諮詢其本地系統管理員以獲取更多資訊。[13]

Unix 注意事項

在 Unix 上,選擇 ~/.local 而非 ~/.python,是因為該目錄類比 /usr/local 的概念,且已被其他多個程式所使用。[7] [11]

Mac OS X 注意事項

在 Mac OS X 上,Python 同樣使用 ~/.local 目錄。[12] Python 的 Framework 建置版本包含 ~/Library/Python/2.6/site-packages 作為額外的搜尋路徑。

實作

site 模組增加了一個新方法 adduserpackage(),會將適當的目錄加入搜尋路徑。若 Python 啟動時該目錄不存在,則不會加入。不過,distutils 會將使用者站點目錄與使用者基礎目錄的位置存放在內部變數中。

使用者站點目錄會被加入至系統站點目錄之前,但在 Python 的預設搜尋路徑與 PYTHONPATH 之後。此設定允許使用者安裝與系統管理員不同版本的套件,同時防止使用者意外覆蓋標準函式庫(stdlib)模組。標準函式庫模組仍可透過 PYTHONPATH 進行覆蓋。

基於安全考量,當有效使用者 ID 或群組 ID 不等於行程 ID (uid / gid) 時,使用者站點目錄 不會 被加入至 sys.path [9]。這是針對 suid 應用程式被程式碼注入的額外防禦機制。不過,Python 的 suid 腳本 必須 始終使用 -E 和 -s 選項,否則使用者可能會插入自己的程式碼。

使用者可透過新的 -s 選項或 PYTHONNOUSERSITE 環境變數來停用使用者站點目錄。此功能可透過將 site.ENABLE_USER_SITE 設定為 False 來全域停用。這必須透過編輯 site.py 來設定,無法在 sitecustomize.py 或更後面的階段修改。

使用者基礎目錄的路徑可透過 PYTHONUSERBASE 環境變數覆蓋。若未設定或為空,則使用預設位置。

distutils.command.install (setup.py install) 增加了一個新參數 --user,用於將套件安裝至使用者站點目錄。所需的目錄會視需求自動建立。

distutils.command.build_ext (setup.py build_ext) 增加了一個新參數 --user,它會將使用者基礎目錄中的 include/ 與 lib/ 目錄加入標頭檔與函式庫的搜尋路徑,並將 lib/ 目錄加入 rpath。

site 模組增加了兩個參數 --user-base--user-site,用於將使用者基礎或站點目錄的路徑輸出至標準輸出。此功能旨在用於腳本編寫,例如 ./configure --prefix $(python2.5 -m site --user-base)

distutils.sysconfig 將會取得存取 site 私有變數的方法。(尚未實作)

Windows 更新程式也需要更新。它應該建立一個選單項目,用於在新的檔案總管視窗中開啟使用者站點目錄。

回溯相容性

待定 (TBD)

參考實作

參考實作可在 bug 追蹤系統中找到。[4]

參考文獻

[6] 關於使用者專屬 site-packages 目錄的初步建議 https://mail.python.org/archives/list/python-dev@python.org/message/V23CUKRH3VCHFLV33ADMHJSM53STPA7I/


來源: https://github.com/python/peps/blob/main/peps/pep-0370.rst

最後修改: 2025-02-01 08:55:40 GMT