sys.path 模块搜索路径的初始化¶
在 Python 启动时会初始化模块搜索路径。可以在 sys.path 中访问此模块搜索路径。
模块搜索路径中的第一个条目是包含输入脚本的目录(如果存在)。否则,第一个条目是当前目录,这是在执行交互式 shell、-c 命令或 -m 模块时的情况。
通常使用 PYTHONPATH 环境变量将目录添加到搜索路径。如果找到此环境变量,则其内容将添加到模块搜索路径。
注意
PYTHONPATH 将影响所有已安装的 Python 版本/环境。请谨慎在 shell 配置文件或全局环境变量中设置此变量。site 模块提供更细致的技术,如下所述。
接下来添加的项目是包含标准 Python 模块的目录以及这些模块所依赖的任何 扩展模块。扩展模块在 Windows 上是 .pyd 文件,在其他平台上是 .so 文件。包含与平台无关的 Python 模块的目录称为 prefix。包含扩展模块的目录称为 exec_prefix。
环境变量 PYTHONHOME 可用于设置 prefix 和 exec_prefix 位置。否则,这些目录将通过使用 Python 可执行文件作为起点,然后查找各种“地标”文件和目录来找到。请注意,将遵循任何符号链接,因此实际的 Python 可执行文件位置将用作搜索起点。Python 可执行文件位置称为 home。
一旦确定了 home,则首先查找 pythonmajorversionminorversion.zip (python311.zip) 来找到 prefix 目录。在 Windows 上,将在 home 中搜索 zip 存档,而在 Unix 上,该存档应位于 lib 中。请注意,即使存档不存在,预期的 zip 存档位置也会添加到模块搜索路径中。如果未找到存档,Windows 上的 Python 将继续通过查找 Lib\os.py 来搜索 prefix。Unix 上的 Python 将查找 lib/pythonmajorversion.minorversion/os.py (lib/python3.11/os.py)。在 Windows 上,prefix 和 exec_prefix 相同,但在其他平台上,将搜索 lib/pythonmajorversion.minorversion/lib-dynload (lib/python3.11/lib-dynload) 并将其用作 exec_prefix 的锚点。在某些平台上,lib 可能为 lib64 或其他值,请参阅 sys.platlibdir 和 PYTHONPLATLIBDIR。
一旦找到,prefix 和 exec_prefix 分别在 sys.prefix 和 sys.exec_prefix 中可用。
最后,site 模块得到处理,site-packages 目录被添加到模块搜索路径。自定义搜索路径的常用方法是创建 sitecustomize 或 usercustomize 模块,如 site 模块文档中所述。
虚拟环境¶
如果 Python 在虚拟环境中运行(如 虚拟环境和包 中所述),则 prefix 和 exec_prefix 具体取决于虚拟环境。
如果在主可执行文件旁边或在可执行文件上一级的目录中找到 pyvenv.cfg 文件,则适用以下变体
如果
home是绝对路径,并且PYTHONHOME未设置,则在推断prefix和exec_prefix时,将使用此路径,而不是主可执行文件的路径。
_pth 文件¶
要完全覆盖 sys.path,请创建一个与共享库或可执行文件同名的 ._pth 文件(python._pth 或 python311._pth)。共享库路径在 Windows 上始终已知,但在其他平台上可能不可用。在 ._pth 文件中,为要添加到 sys.path 的每个路径指定一行。基于共享库名称的文件会覆盖基于可执行文件的文件,这允许在需要时限制加载运行时的任何程序的路径。
当文件存在时,将忽略所有注册表和环境变量,启用隔离模式,并且 site 不会被导入,除非文件中的某一行指定 import site。将忽略空白路径和以 # 开头的行。每个路径可以是绝对路径,也可以是相对于文件位置的相对路径。除了 site 之外的导入语句不被允许,并且不能指定任意代码。
请注意,当指定 import site 时,site 模块将正常处理 .pth 文件(没有前导下划线)。
嵌入式 Python¶
如果 Python 嵌入在另一个应用程序中 Py_InitializeFromConfig(),则可以使用 PyConfig 结构来初始化 Python。路径特定详细信息在 Python 路径配置 中进行了描述。或者,可以使用较旧的 Py_SetPath() 来绕过模块搜索路径的初始化。
另请参见
查找模块 了解详细的 Windows 说明。
在 Unix 平台上使用 Python 了解 Unix 详细信息。