# 29.13. `site` - 网站特定的配置钩

源代码： Lib / site.py

此模块在初始化期间自动导入。可以使用解释器的`-S`选项抑制自动导入。

导入此模块将会将站点特定的路径附加到模块搜索路径，并添加一些内置字段，除非使用`-S`。在这种情况下，可以安全地导入此模块，而不会自动修改模块搜索路径或添加内置模块。要显式触发通常的特定于站点的添加，请调用`site.main()`函数。

在版本3.3中更改：导入用于触发路径操作的模块，即使使用`-S`。

它从头部和尾部构造最多四个目录开始。对于头部，它使用`sys.prefix`和`sys.exec_prefix`；空头被跳过。对于尾部，它使用空字符串，然后`lib/site-packages`（在Windows上）或`lib / python X.Y / site-packages`（在Unix和Macintosh上）。对于每个不同的头 - 尾组合，它看到它是否指现有目录，如果是，则将其添加到`sys.path`，并且还检查新添加的配置文件路径。

在3.5版本中更改：已删除对“site-python”目录的支持。

如果一个名为“pyvenv.cfg”的文件存在于sys.executable之上的一个目录下，sys.prefix和sys.exec_prefix被设置为该目录，并且还检查site-packages（sys.base_prefix和sys.base_exec_prefix将始终是“真正的”前缀的Python安装）。如果“pyvenv.cfg”（引导配置文件）包含设置为“false”（不区分大小写）以外的任何内容的关键字“include-system-site-packages”，系统级前缀仍将搜索站点 - 包装；否则他们不会。

路径配置文件是名称形式为`name .pth`并存在于上述四个目录中的文件；其内容是要添加到`sys.path`的附加项目（每行一个）。不存在的项目从不会添加到`sys.path`。没有任何项目添加到`sys.path`多次。将跳过以`#`开头的空行和行。以`import`开头的行（后跟空格或制表符）被执行。

例如，假设`sys.prefix`和`sys.exec_prefix`设置为`/usr/local`。Python X.Y库随后安装在`/ usr / local / lib / python X.Y`中。假设它有三个子目录的子目录`/ usr / local / lib / python X.Y / site-packages `foo`，`bar`和`spam`和两个路径配置文件`foo.pth`和`bar.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.pth`在字母之前`foo.pth`之前，`bar`目录位于`foo`和`spam`被省略，因为它在任一路径配置文件中未提及。

在这些路径操作之后，尝试导入名为`sitecustomize`的模块，该模块可以执行任意特定于站点的自定义。它通常由系统管理员在site-packages目录中创建。如果此导入失败并出现`ImportError`异常，则会被忽略。如果Python启动时没有可用的输出流，如Windows上的`pythonw.exe`（默认情况下用于启动IDLE），则会忽略`sitecustomize`的尝试输出。除了`ImportError`之外的任何异常都会导致进程无声或可能是神秘的故障。

此后，尝试导入名为`usercustomize`的模块，如果`ENABLE_USER_SITE`为true，则可以执行任意用户特定的自定义。该文件旨在在用户site-packages目录（见下文）中创建，这是`sys.path`的一部分，除非由`-s`禁用。将默认忽略`ImportError`。

注意，对于一些非Unix系统，`sys.prefix`和`sys.exec_prefix`为空，并且跳过路径操作；但仍尝试导入`sitecustomize`和`usercustomize`。

## 29.13.1. Readline configuration

On systems that support `readline`, this module will also import and configure the `rlcompleter` module, if Python is started in interactive mode and without the `-S` option. 默认行为是启用制表符完成，并使用`~/.python_history`作为历史保存文件。要禁用它，请在您的`sitecustomize`或`usercustomize`模块或您的模块中删除（或覆盖）`sys.__interactivehook__` `PYTHONSTARTUP`文件。

在版本3.4中更改：自动激活rlcompleter和历史记录。

## 29.13.2. Module contents

`site.``PREFIXES`

  site-packages目录的前缀列表。

`site.``ENABLE_USER_SITE`

  标志显示用户site-packages目录的状态。`True`表示已启用，并已添加到`sys.path`。`False`表示已由用户请求停用（`-s`或 `PYTHONNOUSERSITE`）。`None`表示由于安全原因（用户或组ID与有效ID不匹配）或管理员已禁用。

`site.``USER_SITE`

  用户站点的路径 - 正在运行的Python的包。可以`None`如果`getusersitepackages()`尚未被调用。对于UNIX和非框架，默认值为`〜/ .local / lib / python X.Y / site-packages Mac OS X构建，`〜/ Library / Python / X.Y / lib / python / site-packages`框架构建和`%APPDATA% \ Python \ Python XY \ site-packages t10 >在Windows上。``此目录是网站目录，这意味着它将处理`.pth`文件。

`site.``USER_BASE`

  用户site-packages的基本目录的路径。可以`None`如果`getuserbase()`尚未被调用。对于UNIX和Mac OS X非框架构建，默认值为`~/.local`，`〜/ Library / Python / X.Y （对于Mac框架构建）和`%APPDATA% \ Python``Distutils使用此值计算脚本，数据文件，Python模块等的安装目录。用于user installation scheme。另见 `PYTHONUSERBASE`。

`site.``main`()

  将所有标准站点特定目录添加到模块搜索路径。此模块导入时，此函数会自动调用，除非Python解释器以`-S`标志启动。

  在版本3.3中更改：此函数用于无条件调用。

`site.``addsitedir`(sitedir, known_paths=None)

  将目录添加到sys.path并处理其`.pth`文件。通常用于`sitecustomize`或`usercustomize`（见上文）。

`site.``getsitepackages`()

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

  版本3.2中的新功能。

`site.``getuserbase`()

  返回用户基本目录`USER_BASE`的路径。如果尚未初始化，此功能也将设置它，遵守 `PYTHONUSERBASE`。

  版本3.2中的新功能。

`site.``getusersitepackages`()

  返回用户特定的site-packages目录`USER_SITE`的路径。如果尚未初始化，此函数也将设置它，遵守 `PYTHONNOUSERSITE`和`USER_BASE`。

  版本3.2中的新功能。

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

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

如果没有参数调用，它将打印标准输出上的`sys.path`的内容，后面是`USER_BASE`的值，以及目录是否存在， `USER_SITE`的内容，最后是`ENABLE_USER_SITE`的值。

`--user-base```

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

`--user-site```

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

如果给出两个选项，将打印用户基本和用户站点（始终按此顺序），用`os.pathsep`分隔。

如果给出任何选项，脚本将退出，其中包含以下值之一：`O`如果用户site-packages目录已启用，则`1` `2`如果由于安全原因或管理员禁用，并且值大于2（如果存在错误）。

也可以看看

PEP 370 - 每个用户site-packages目录