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

源代碼: Lib/site.py


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

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

在 3.3 版更改: 在之前即便使用了 -S,導(dǎo)入此模塊仍然會(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 版更改: 對(duì) "site-python" 目錄的支持已被移除。

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

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

備注

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

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

# 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

請(qǐng)注意 bletch 已被省略因?yàn)樗⒉淮嬖冢?code class="file docutils literal notranslate">bar 目前在 foo 目錄之前因?yàn)?bar.pth 按字母順序排在 foo.pth 之前;而 spam 已被省略因?yàn)樗趦蓚€(gè)路徑配置文件中都未被提及。

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

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

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

Readline 配置?

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

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

模塊內(nèi)容?

site.PREFIXES?

site-packages 目錄的前綴列表。

site.ENABLE_USER_SITE?

顯示用戶 site-packages 目錄狀態(tài)的旗標(biāo)。 True 意味著它被啟用并被添加到 sys.path。 False 意味著它按照用戶請(qǐng)求被禁用 (通過(guò) -sPYTHONNOUSERSITE)。 None 意味著它因安全理由(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()?

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

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

site.addsitedir(sitedir, known_paths=None)?

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

site.getsitepackages()?

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

3.2 新版功能.

site.getuserbase()?

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

3.2 新版功能.

site.getusersitepackages()?

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

3.2 新版功能.

命令行界面?

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

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

如果它被不帶參數(shù)地調(diào)用,它將在標(biāo)準(zhǔn)輸出打印 sys.path 的內(nèi)容,再打印 USER_BASE 的值以及該目錄是否存在,然后打印 USER_SITE 的相應(yīng)信息,最后打印 ENABLE_USER_SITE 的值。

--user-base?

輸出用戶基本的路徑。

--user-site?

輸出用戶site-packages目錄的路徑。

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

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

參見(jiàn)