site — 站点专属配置钩子

源代码: Lib/site.py


此模块在初始化期间自动导入。 自动导入可以通过解释器的 -S 选项来禁用。

通常,导入此模块会将站点专属路径附加到模块搜索路径,并将包括 help() 在内的 可调用对象 添加到内置命名空间。但是,Python 启动选项 -S 会阻止此操作,并且此模块可以在不自动修改模块搜索路径或不向内置命名空间添加任何内容的情况下安全导入。要显式触发通常的站点专属添加,请调用 main() 函数。

3.3 版本中已更改: 即使使用 -S,导入模块也会触发路径操作。

它首先从头部和尾部构建最多四个目录。对于头部,它使用 sys.prefixsys.exec_prefix;空头部将被跳过。对于尾部,它使用空字符串,然后是 lib/site-packages(在 Windows 上)或 lib/pythonX.Y[t]/site-packages(在 Unix 和 macOS 上)。(可选的后缀“t”表示 自由线程 构建,如果 sys.abiflags 常量中存在 "t",则附加此后缀。)对于每个不同的头尾组合,它会检查它是否指向一个现有目录,如果是,则将其添加到 sys.path,并检查新添加的路径以查找配置文件。

3.5 版本中已更改: 对“site-python”目录的支持已被移除。

3.13 版本中已更改: 在 Unix 上,自由线程 Python 安装通过版本特定目录名中的“t”后缀来识别,例如 lib/python3.13t/

3.14 版本中已更改: site 不再负责在 虚拟环境 中更新 sys.prefixsys.exec_prefix。这现在在 路径初始化 期间完成。因此,在 虚拟环境 下,sys.prefixsys.exec_prefix 不再依赖于 site 初始化,因此不受 -S 的影响。

虚拟环境 中运行时,会检查 sys.prefix 中的 pyvenv.cfg 文件以查找站点专属配置。如果 include-system-site-packages 键存在且设置为 true(不区分大小写),则会搜索系统级前缀以查找 site-packages,否则不会。

路径配置文件是一个名称为 name.pth 且存在于上述四个目录之一的文件;其内容是添加到 sys.path 的额外项目(每行一个)。不存在的项目永远不会添加到 sys.path,并且不检查该项目是指向目录还是文件。任何项目都不会被多次添加到 sys.path。空行和以 # 开头的行将被跳过。以 import(后跟空格或制表符)开头的行将被执行。

备注

.pth 文件中的可执行行在每次 Python 启动时运行,无论特定模块是否实际会被使用。因此,其影响应尽量减小。可执行行的主要目的是使相应的模块可导入(加载第三方导入钩子,调整 PATH 等)。任何其他初始化都应该在模块实际导入时(如果发生)完成。将代码块限制为单行是为了阻止在此处放置更复杂的内容而采取的有意措施。

3.13 版本中已更改: .pth 文件现在首先通过 UTF-8 解码,如果失败,则通过 locale encoding 解码。

例如,假设 sys.prefixsys.exec_prefix 设置为 /usr/local。那么 Python X.Y 库安装在 /usr/local/lib/pythonX.Y 中。假设它有一个子目录 /usr/local/lib/pythonX.Y/site-packages,其中包含三个子子目录 foobarspam,以及两个路径配置文件 foo.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 被省略,因为它在任何路径配置文件中都没有提及。

sitecustomize

在这些路径操作之后,会尝试导入名为 sitecustomize 的模块,该模块可以执行任意的站点专属自定义。它通常由系统管理员在 site-packages 目录中创建。如果此导入因 ImportError 或其子类异常而失败,并且异常的 name 属性等于 'sitecustomize',则会静默忽略。如果 Python 在没有可用输出流的情况下启动,例如 Windows 上的 pythonw.exe(默认用于启动 IDLE),则会忽略来自 sitecustomize 的尝试输出。任何其他异常都会导致进程静默且可能神秘地失败。

usercustomize

在此之后,如果 ENABLE_USER_SITE 为真,则会尝试导入名为 usercustomize 的模块,该模块可以执行任意的用户专属自定义。此文件旨在用户 site-packages 目录中创建(见下文),该目录是 sys.path 的一部分,除非被 -s 禁用。如果此导入因 ImportError 或其子类异常而失败,并且异常的 name 属性等于 'usercustomize',则会静默忽略。

请注意,对于某些非 Unix 系统,sys.prefixsys.exec_prefix 为空,路径操作将被跳过;但是仍然会尝试导入 sitecustomizeusercustomize

Readline 配置

在支持 readline 的系统上,如果 Python 在 交互模式 下启动且没有 -S 选项,此模块还将导入和配置 rlcompleter 模块。默认行为是启用 Tab 补全,并使用 ~/.python_history 作为历史保存文件。要禁用它,请删除(或覆盖)sys.__interactivehook__ 属性,可在你的 sitecustomizeusercustomize 模块或你的 PYTHONSTARTUP 文件中进行。

3.4 版本中已更改: rlcompleter 和历史记录的激活已变为自动。

模块内容

site.PREFIXES

site-packages 目录的前缀列表。

site.ENABLE_USER_SITE

显示用户 site-packages 目录状态的标志。True 表示已启用并已添加到 sys.pathFalse 表示用户请求禁用(通过 -sPYTHONNOUSERSITE)。None 表示因安全原因(用户或组 ID 与有效 ID 不匹配)或由管理员禁用。

site.USER_SITE

正在运行的 Python 的用户 site-packages 路径。如果尚未调用 getusersitepackages(),则可能为 None。对于 UNIX 和非框架 macOS 构建,默认值为 ~/.local/lib/pythonX.Y[t]/site-packages;对于 macOS 框架构建,默认值为 ~/Library/Python/X.Y/lib/python/site-packages;对于 Windows,默认值为 %APPDATA%\Python\PythonXY\site-packages。可选的“t”表示自由线程构建。此目录是一个站点目录,这意味着其中的 .pth 文件将被处理。

site.USER_BASE

用户 site-packages 的基本目录路径。如果尚未调用 getuserbase(),则可能为 None。对于 UNIX 和 macOS 非框架构建,默认值为 ~/.local;对于 macOS 框架构建,默认值为 ~/Library/Python/X.Y;对于 Windows,默认值为 %APPDATA%\Python。此值用于计算 用户安装方案 的脚本、数据文件、Python 模块等的安装目录。另请参阅 PYTHONUSERBASE

site.main()

将所有标准站点专属目录添加到模块搜索路径。此函数在此模块被导入时自动调用,除非 Python 解释器使用 -S 标志启动。

3.3 版本中已更改: 此函数曾经无条件调用。

site.addsitedir(sitedir, known_paths=None)

将目录添加到 sys.path 并处理其 .pth 文件。通常在 sitecustomizeusercustomize 中使用(见上文)。

site.getsitepackages()

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

在 3.2 版本加入。

site.getuserbase()

返回用户基本目录的路径,即 USER_BASE。如果尚未初始化,此函数也将对其进行设置,并遵循 PYTHONUSERBASE

在 3.2 版本加入。

site.getusersitepackages()

返回用户特定 site-packages 目录的路径,即 USER_SITE。如果尚未初始化,此函数也将对其进行设置,并遵循 USER_BASE。要确定用户特定 site-packages 是否已添加到 sys.path,应使用 ENABLE_USER_SITE

在 3.2 版本加入。

命令行界面

site 模块还提供了一种从命令行获取用户目录的方法

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

如果它在没有参数的情况下调用,它将打印 sys.path 的内容到标准输出,后跟 USER_BASE 的值以及该目录是否存在,然后是 USER_SITE 的相同内容,最后是 ENABLE_USER_SITE 的值。

--user-base

打印用户基本目录的路径。

--user-site

打印用户 site-packages 目录的路径。

如果两个选项都给出,则会打印用户基本目录和用户站点目录(始终按此顺序),并用 os.pathsep 分隔。

如果给定任何选项,脚本将以以下值之一退出:如果用户 site-packages 目录已启用,则为 0;如果用户禁用,则为 1;如果因安全原因或由管理员禁用,则为 2;如果出现错误,则为大于 2 的值。

参见