site
—— 指定域的配置鉤子?
源代碼: Lib/site.py
這個模塊將在初始化時被自動導(dǎo)入。 此自動導(dǎo)入可以通過使用解釋器的 -S
選項來屏蔽。
導(dǎo)入此模塊將會附加域特定的路徑到模塊搜索路徑并且添加一些內(nèi)建對象,除非使用了 -S
選項。 那樣的話,模塊可以被安全地導(dǎo)入,而不會對模塊搜索路徑和內(nèi)建對象有自動的修改或添加。要明確地觸發(fā)通常域特定的添加,調(diào)用函數(shù) site.main()
。
在 3.3 版更改: 在之前即便使用了 -S
,導(dǎo)入此模塊仍然會觸發(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 之上的一個目錄中,則 sys.prefix 和 sys.exec_prefix 將被設(shè)置為該目錄,并且還會檢查 site-packages ( sys.base_prefix 和 sys.base_exec_prefix 始終是 Python 安裝的 "真實" 前綴)。 如果 "pyvenv.cfg" (引導(dǎo)程序配置文件)包含設(shè)置為非 "true"(不區(qū)分大小寫)的 "include-system-site-packages" 鍵,則不會在系統(tǒng)級前綴中搜索 site-packages;反之則會。
一個路徑配置文件是具有 name.pth
命名格式的文件,并且存在上面提到的四個目錄之一中;它的內(nèi)容是要添加到 sys.path
中的額外項目(每行一個)。不存在的項目不會添加到 sys.path
,并且不會檢查項目指向的是目錄還是文件。項目不會被添加到 sys.path
超過一次??招泻陀?#
起始的行會被跳過。以 import
開始的行(跟著空格或 TAB)會被執(zhí)行。
備注
每次啟動 Python,在 .pth
文件中的可執(zhí)行行都將會被運(yùn)行,而不管特定的模塊實際上是否需要被使用。 因此,其影響應(yīng)降至最低??蓤?zhí)行行的主要預(yù)期目的是使相關(guān)模塊可導(dǎo)入(加載第三方導(dǎo)入鉤子,調(diào)整 PATH
等)。如果它發(fā)生了,任何其他的初始化都應(yīng)當(dāng)在模塊實際導(dǎo)入之前完成。將代碼塊限制為一行是一種有意采取的措施,不鼓勵在此處放置更復(fù)雜的內(nèi)容。
例如,假設(shè) sys.prefix
和 sys.exec_prefix
已經(jīng)被設(shè)置為 /usr/local
。 Python X.Y 的庫之后被安裝為 /usr/local/lib/pythonX.Y
。假設(shè)有一個擁有三個孫目錄 foo
, bar
和 spam
的子目錄 /usr/local/lib/pythonX.Y/site-packages
,并且有兩個路徑配置文件 foot.pth
和 bar.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
請注意 bletch
已被省略因為它并不存在;bar
目前在 foo
目錄之前因為 bar.pth
按字母順序排在 foo.pth
之前;而 spam
已被省略因為它在兩個路徑配置文件中都未被提及。
在這些路徑操作之后,會嘗試導(dǎo)入一個名為 sitecustomize
的模塊,它可以執(zhí)行任意站點(diǎn)專屬的定制。 它通常是由系統(tǒng)管理員在 site-packages 目錄下創(chuàng)建的。 如此此導(dǎo)入失敗并引發(fā) ImportError
或其子類異常,并且異常的 name
屬性等于 'sitecustomize'
,則它會被靜默地忽略。 如果 Python 是在沒有可用輸出流的情況下啟動的,例如在 Windows 上使用 pythonw.exe
(它默認(rèn)被用于啟動 start IDLE),則來自 sitecustomize
的輸出嘗試會被忽略。 任何其他異常都會導(dǎo)致靜默且可能令人迷惑不解的進(jìn)程失敗。
在此之后,會嘗試導(dǎo)入一個名為 usercustomize
的模塊,它可以執(zhí)行任意用戶專屬的定制,如果 ENABLE_USER_SITE
為真值的話。 這個文件應(yīng)該在用戶的 site-packages 目錄中創(chuàng)建(見下文),該目錄是 sys.path
的組成部分,除非被 -s
所禁用。 如果此導(dǎo)入失敗并引發(fā) ImportError
或者其子類異常,并且異常的 name
屬性等于 'usercustomize'
,它會被靜默地忽略。
請注意對于某些非 Unix 系統(tǒng)來說,sys.prefix
和 sys.exec_prefix
均為空值,并且路徑操作會被跳過;但是仍然會嘗試導(dǎo)入 sitecustomize
和 usercustomize
。
Readline 配置?
在支持 readline
的系統(tǒng)上,這個模塊也將導(dǎo)入并配置 rlcompleter
模塊,如果 Python 是以 交互模式 啟動并且不帶 -S
選項的話。 默認(rèn)的行為是啟用 tab 鍵補(bǔ)全并使用 ~/.python_history
作為歷史存檔文件。 要禁用它,請刪除(或重載)你的 sitecustomize
或 usercustomize
模塊或 PYTHONSTARTUP
文件中的 sys.__interactivehook__
屬性。
在 3.4 版更改: rlcompleter 和 history 會被自動激活。
模塊內(nèi)容?
- site.PREFIXES?
site-packages 目錄的前綴列表。
- site.ENABLE_USER_SITE?
顯示用戶 site-packages 目錄狀態(tài)的旗標(biāo)。
True
意味著它被啟用并被添加到sys.path
。False
意味著它按照用戶請求被禁用 (通過-s
或PYTHONNOUSERSITE
)。None
意味著它因安全理由(user 或 group id 和 effective id 之間不匹配)或是被管理員所禁用。
- site.USER_SITE?
Path to the user site-packages for the running Python. Can be
None
ifgetusersitepackages()
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
ifgetuserbase()
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 alsoPYTHONUSERBASE
.
- site.main()?
將所有的標(biāo)準(zhǔn)站點(diǎn)專屬目錄添加到模塊搜索路徑。 這個函數(shù)會在導(dǎo)入此模塊時被自動調(diào)用,除非 Python 解釋器啟動時附帶了
-S
旗標(biāo)。在 3.3 版更改: 這個函數(shù)使用無條件調(diào)用。
- site.addsitedir(sitedir, known_paths=None)?
將一個目錄添加到 sys.path 并處理其
.pth
文件。 通常被用于sitecustomize
或usercustomize
(見下文)。
- site.getsitepackages()?
返回包含所有全局 site-packages 目錄的列表。
3.2 新版功能.
- site.getuserbase()?
返回用戶基準(zhǔn)目錄的路徑
USER_BASE
。 如果它尚未被初始化,則此函數(shù)還將參照PYTHONUSERBASE
來設(shè)置它。3.2 新版功能.
- site.getusersitepackages()?
返回用戶專屬 site-packages 目錄的路徑
USER_SITE
。 如果它尚未被初始化,則此函數(shù)還將參照USER_BASE
來設(shè)置它。 要確定用戶專屬 site-packages 是否已被添加到sys.path
則應(yīng)當(dāng)使用ENABLE_USER_SITE
。3.2 新版功能.
命令行界面?
site
模塊還提供了一個從命令行獲取用戶目錄的方式:
$ 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目錄的路徑。
如果同時給出了兩個選項,則將打印用戶基準(zhǔn)目錄和用戶站點(diǎn)信息(總是按此順序),并以 os.pathsep
分隔。
如果給出了其中一個選項,腳本將退出并返回以下值中的一個:如果用戶級 site-packages 目錄被啟用則為 0
,如果它被用戶禁用則為 1
,如果它因安全理由或被管理員禁用則為 2
,如果發(fā)生錯誤則為大于 2 的值。
參見
PEP 370 -- 分用戶的 site-packages 目錄
The initialization of the sys.path module search path -- The initialization of
sys.path
.