site —— 指定域的配置鉤子?

源代碼: Lib/site.py


這個(gè)模塊將在初始化時(shí)被自動(dòng)導入。 此自動(dòng)導入可以通過(guò)使用解釋器的 -S 選項來(lái)屏蔽。

導入此模塊將會(huì )附加域特定的路徑到模塊搜索路徑并且添加一些內建對象,除非使用了 -S 選項。 那樣的話(huà),模塊可以被安全地導入,而不會(huì )對模塊搜索路徑和內建對象有自動(dòng)的修改或添加。要明確地觸發(fā)通常域特定的添加,調用函數 site.main()。

在 3.3 版更改: 在之前即便使用了 -S,導入此模塊仍然會(huì )觸發(fā)路徑操縱。

It starts by constructing up to four directories from a head and a tail part. For the head part, it uses sys.prefix and sys.exec_prefix; empty heads are skipped. For the tail part, it uses the empty string and then lib/site-packages (on Windows) or lib/pythonX.Y/site-packages (on Unix and macOS). For each of the distinct head-tail combinations, it sees if it refers to an existing directory, and if so, adds it to sys.path and also inspects the newly added path for configuration files.

在 3.5 版更改: 對 "site-python" 目錄的支持已被移除。

如果名為 "pyvenv.cfg" 的文件存在于 sys.executable 之上的一個(gè)目錄中,則 sys.prefix 和 sys.exec_prefix 將被設置為該目錄,并且還會(huì )檢查 site-packages ( sys.base_prefix 和 sys.base_exec_prefix 始終是 Python 安裝的 "真實(shí)" 前綴)。 如果 "pyvenv.cfg" (引導程序配置文件)包含設置為非 "true"(不區分大小寫(xiě))的 "include-system-site-packages" 鍵,則不會(huì )在系統級前綴中搜索 site-packages;反之則會(huì )。

一個(gè)路徑配置文件是具有 name.pth 命名格式的文件,并且存在上面提到的四個(gè)目錄之一中;它的內容是要添加到 sys.path 中的額外項目(每行一個(gè))。不存在的項目不會(huì )添加到 sys.path,并且不會(huì )檢查項目指向的是目錄還是文件。項目不會(huì )被添加到 sys.path 超過(guò)一次??招泻陀?# 起始的行會(huì )被跳過(guò)。以 import 開(kāi)始的行(跟著(zhù)空格或 TAB)會(huì )被執行。

備注

每次啟動(dòng) Python,在 .pth 文件中的可執行行都將會(huì )被運行,而不管特定的模塊實(shí)際上是否需要被使用。 因此,其影響應降至最低??蓤绦行械闹饕A期目的是使相關(guān)模塊可導入(加載第三方導入鉤子,調整 PATH 等)。如果它發(fā)生了,任何其他的初始化都應當在模塊實(shí)際導入之前完成。將代碼塊限制為一行是一種有意采取的措施,不鼓勵在此處放置更復雜的內容。

例如,假設 sys.prefixsys.exec_prefix 已經(jīng)被設置為 /usr/local。 Python X.Y 的庫之后被安裝為 /usr/local/lib/pythonX.Y。假設有一個(gè)擁有三個(gè)孫目錄 foo, barspam 的子目錄 /usr/local/lib/pythonX.Y/site-packages,并且有兩個(gè)路徑配置文件 foot.pthbar.pth。假定 foo.pth 內容如下:

# foo package configuration

foo
bar
bletch

并且 bar.pth 包含:

# bar package configuration

bar

則下面特定版目錄將以如下順序被添加到 sys.path。

/usr/local/lib/pythonX.Y/site-packages/bar
/usr/local/lib/pythonX.Y/site-packages/foo

請注意 bletch 已被省略因為它并不存在;bar 目前在 foo 目錄之前因為 bar.pth 按字母順序排在 foo.pth 之前;而 spam 已被省略因為它在兩個(gè)路徑配置文件中都未被提及。

在這些路徑操作之后,會(huì )嘗試導入一個(gè)名為 sitecustomize 的模塊,它可以執行任意站點(diǎn)專(zhuān)屬的定制。 它通常是由系統管理員在 site-packages 目錄下創(chuàng )建的。 如此此導入失敗并引發(fā) ImportError 或其子類(lèi)異常,并且異常的 name 屬性等于 'sitecustomize',則它會(huì )被靜默地忽略。 如果 Python 是在沒(méi)有可用輸出流的情況下啟動(dòng)的,例如在 Windows 上使用 pythonw.exe (它默認被用于啟動(dòng) start IDLE),則來(lái)自 sitecustomize 的輸出嘗試會(huì )被忽略。 任何其他異常都會(huì )導致靜默且可能令人迷惑不解的進(jìn)程失敗。

在此之后,會(huì )嘗試導入一個(gè)名為 usercustomize 的模塊,它可以執行任意用戶(hù)專(zhuān)屬的定制,如果 ENABLE_USER_SITE 為真值的話(huà)。 這個(gè)文件應該在用戶(hù)的 site-packages 目錄中創(chuàng )建(見(jiàn)下文),該目錄是 sys.path 的組成部分,除非被 -s 所禁用。 如果此導入失敗并引發(fā) ImportError 或者其子類(lèi)異常,并且異常的 name 屬性等于 'usercustomize',它會(huì )被靜默地忽略。

請注意對于某些非 Unix 系統來(lái)說(shuō),sys.prefixsys.exec_prefix 均為空值,并且路徑操作會(huì )被跳過(guò);但是仍然會(huì )嘗試導入 sitecustomizeusercustomize。

Readline 配置?

在支持 readline 的系統上,這個(gè)模塊也將導入并配置 rlcompleter 模塊,如果 Python 是以 交互模式 啟動(dòng)并且不帶 -S 選項的話(huà)。 默認的行為是啟用 tab 鍵補全并使用 ~/.python_history 作為歷史存檔文件。 要禁用它,請刪除(或重載)你的 sitecustomizeusercustomize 模塊或 PYTHONSTARTUP 文件中的 sys.__interactivehook__ 屬性。

在 3.4 版更改: rlcompleter 和 history 會(huì )被自動(dòng)激活。

模塊內容?

site.PREFIXES?

site-packages 目錄的前綴列表。

site.ENABLE_USER_SITE?

顯示用戶(hù) site-packages 目錄狀態(tài)的旗標。 True 意味著(zhù)它被啟用并被添加到 sys.path。 False 意味著(zhù)它按照用戶(hù)請求被禁用 (通過(guò) -sPYTHONNOUSERSITE)。 None 意味著(zhù)它因安全理由(user 或 group id 和 effective id 之間不匹配)或是被管理員所禁用。

site.USER_SITE?

Path to the user site-packages for the running Python. Can be None if getusersitepackages() hasn't been called yet. Default value is ~/.local/lib/pythonX.Y/site-packages for UNIX and non-framework macOS builds, ~/Library/Python/X.Y/lib/python/site-packages for macOS framework builds, and %APPDATA%\Python\PythonXY\site-packages on Windows. This directory is a site directory, which means that .pth files in it will be processed.

site.USER_BASE?

Path to the base directory for the user site-packages. Can be None if getuserbase() hasn't been called yet. Default value is ~/.local for UNIX and macOS non-framework builds, ~/Library/Python/X.Y for macOS framework builds, and %APPDATA%\Python for Windows. This value is used by Distutils to compute the installation directories for scripts, data files, Python modules, etc. for the user installation scheme. See also PYTHONUSERBASE.

site.main()?

將所有的標準站點(diǎn)專(zhuān)屬目錄添加到模塊搜索路徑。 這個(gè)函數會(huì )在導入此模塊時(shí)被自動(dòng)調用,除非 Python 解釋器啟動(dòng)時(shí)附帶了 -S 旗標。

在 3.3 版更改: 這個(gè)函數使用無(wú)條件調用。

site.addsitedir(sitedir, known_paths=None)?

將一個(gè)目錄添加到 sys.path 并處理其 .pth 文件。 通常被用于 sitecustomizeusercustomize (見(jiàn)下文)。

site.getsitepackages()?

返回包含所有全局 site-packages 目錄的列表。

3.2 新版功能.

site.getuserbase()?

返回用戶(hù)基準目錄的路徑 USER_BASE。 如果它尚未被初始化,則此函數還將參照 PYTHONUSERBASE 來(lái)設置它。

3.2 新版功能.

site.getusersitepackages()?

返回用戶(hù)專(zhuān)屬 site-packages 目錄的路徑 USER_SITE。 如果它尚未被初始化,則此函數還將參照 USER_BASE 來(lái)設置它。 要確定用戶(hù)專(zhuān)屬 site-packages 是否已被添加到 sys.path 則應當使用 ENABLE_USER_SITE。

3.2 新版功能.

命令行界面?

site 模塊還提供了一個(gè)從命令行獲取用戶(hù)目錄的方式:

$ python3 -m site --user-site
/home/user/.local/lib/python3.3/site-packages

如果它被不帶參數地調用,它將在標準輸出打印 sys.path 的內容,再打印 USER_BASE 的值以及該目錄是否存在,然后打印 USER_SITE 的相應信息,最后打印 ENABLE_USER_SITE 的值。

--user-base?

輸出用戶(hù)基本的路徑。

--user-site?

輸出用戶(hù)site-packages目錄的路徑。

如果同時(shí)給出了兩個(gè)選項,則將打印用戶(hù)基準目錄和用戶(hù)站點(diǎn)信息(總是按此順序),并以 os.pathsep 分隔。

如果給出了其中一個(gè)選項,腳本將退出并返回以下值中的一個(gè):如果用戶(hù)級 site-packages 目錄被啟用則為 0,如果它被用戶(hù)禁用則為 1,如果它因安全理由或被管理員禁用則為 2,如果發(fā)生錯誤則為大于 2 的值。

參見(jiàn)