如何使用 _pth 文件重写 Python 模块搜索路径

我被代码海扁署名-非商业-禁演绎
阅读 4:12·字数 1261·发布 
Bilibili 空间
关注 950

Python _pth 文件

_pth文件和放置于第三方包的pth文件类似,可以用来设置 Python 模块搜索路径,文件中的每一行,可对应一条采用绝对路径或相对路径的目录信息。

设置搜索路径

如果你想了解一些pth文件的基本用法,可以查看使用 pth 文件设置 Python 模块搜索路径一段。

_pth 文件将重写 Python 模块搜索路径

pth文件不同,_pth文件将重写整个 Python 模块搜索路径,如果你创建了_pth文件,却没有在文件中指定任何目录,那么 Python 可能无法正常启动,因为缺少有效的搜索路径,会使 Python 无法找到运行所需的模块。

要让 Python 正确运行,至少应在_pth文件中指定标准库和扩展库的目录。

_pth 文件中列出的目录不需要真实存在

pth文件不同,当_pth文件包含不存在的目录时,他们依然会被添加至模块搜索路径。

模块搜索路径

要了解 Python 标准/扩展库的位置,你可以查看Python 标准/扩展库目录一段。

这里是一个可能适用于 Windows 的_pth文件,他指出了标准库zip文件的路径,以及标准/扩展库的目录。

python._pth
# 标准库 zip 文件路径
python312.zip
# 标准/扩展库目录
.
# …

在 _pth 文件中使用 import site 添加 Python 第三方包目录

在编写代码方面,_pth文件受到了更多的约束,仅限于使用import site,该语句的效果是将第三方包目录添加至模块搜索路径,并使得这些目录中pth文件可以被正常处理。

当然,以上对于第三方包目录和pth文件的操作,是 Python 常规启动流程的一部分(当_pth文件不存在时)。

在 _pth 文件中手动指定第三方包目录和使用 import site 之间的区别

虽然,你可以在_pth文件中手动指定第三方包目录,但那会使pth文件失效,只有导入site模块后,pth文件才能被识别。

python._pth
# …
# 添加第三方包目录,并使目录中的 pth 文件可以被正常处理
import site

Python _pth 文件的名称和位置

不像pth文件可以随意命名,_pth文件的名称需要和 Python 可执行文件的名称保持一致,_pth文件存放的位置,应该位于 Python 可执行文件所在的目录。

在 Windows 中为 Python 标准库 zip 文件创建 _pth 文件

在 Windows 系统中,_pth文件的名称还可以与标准库zip文件的名称一致,但这样的做法在其他操作系统中可能无效,如果你采用两种命名方式创建了两个_pth文件,那么与 Python 可执行文件同名的_pth文件将失效。

假设 Windows 中 Python 可执行文件为python.exe,标准库zip文件为python312.zip,那么_pth文件就可以命名为python._pthpython312._pth

在 UNIX/Linux/macOS 中为多个 Python 可执行文件创建 _pth 文件

如果是 UNIX/Linux/macOS,则 Python 的可执行文件可能有多个。假设bin目录中同时存在python3python3.12,那么你可以在该目录新建两个_pth文件,python3._pthpython3.12._pth,他们将分别对应在命令行输入python3python3.12的情况。

Python _pth 文件中的相对路径

_pth文件中的相对路径,是相对于_pth文件所在的目录,而非 Python 的当前工作目录。在被添加至sys.path时,他们会转换为等价的绝对路径。

源码

python._pth·codebeatme/python-reference·GitHub