Python 模块搜索路径介绍,Python 模块搜索路径中的目录有哪些

我被代码海扁署名-非商业-禁演绎
阅读 7:58·字数 2390·更新 
Bilibili 空间
关注 950

本节所讲述的 Python 模块搜索路径,同样适用于包,因为包是特殊的模块。

Python 模块搜索路径

Python 模块搜索路径(Module Search Path)用于搜索需要载入的 Python 模块,在 Python 启动后,他与sys模块的path变量是等同的。

模块搜索路径并非单一的路径,这一点和环境变量PATH类似,他可以指向多个包含 Python 模块的文件夹,或zip压缩文件。此外,搜索路径可以包含绝对路径或相对路径,比如,''是一个表示当前目录的相对路径。

如何查看 Python 模块搜索路径?

在 Python 的交互模式中,输入并执行import syssys.path两行代码,即可查看sys.path表示的模块搜索路径。如果是py文件,则可将sys.path替换为print(sys.path)

Windows
import sys
sys.path
['', '\\python312.zip', '', '\\Lib', '\\Lib\\site-packages']
UNIX/Linux/macOS
import sys
sys.path
['', '/usr/lib64/python312.zip', '/usr/lib64/python3.12', '/usr/lib64/python3.12/lib-dynload', '/usr/lib64/python3.12/site-packages', '/usr/lib/python3.12/site-packages']
print_path.py
# 显示 sys.path 表示的 Python 搜索路径
import sys
print(sys.path)

Python 模块搜索路径的优先级

sys模块中,保存 Python 模块搜索路径的变量path是一个列表对象,其第一个元素表示的路径,首先被用于模块的搜索,如果模块不存在则使用下一个元素,直至模块被找到或抵达列表末尾。

Python 模块搜索路径中的目录

Python 模块搜索路径一般包含以下几种类别的目录,被运行目标所在的目录或当前工作目录,环境变量包含的目录,标准/扩展库目录,第三方包目录,pth文件中的目录,以及 Windows 注册表中的目录。

Python 脚本目录或当前目录

当你使用 Python 运行脚本文件时,模块搜索路径的第一项是脚本文件所在的目录。当执行包含__main__.py的文件夹或zip文件时,模块搜索路径的第一项为文件夹或zip文件所在的目录。

如果未指定运行目标,那么模块搜索路径的第一项为当前工作目录,该目录可能表述为相对路径''。当你在命令行输入pythonpython3进入 Python 交互模式,或使用-c选项执行代码,-m选项执行模块时,搜索路径的第一项等价于命令行的当前目录。

脚本文件run.py显示了搜索路径的第一个元素,在使用命令行运行该文件后,我们将看到run.py所在的目录。

run.py
# 显示 sys.path 的第一个元素,他是该脚本文件所在的目录
import sys
print(f'脚本位于:{sys.path[0]}')
Windows
脚本位于:\import_system
UNIX/Linux/macOS
脚本位于:/import_system

压缩文件run.zip包含脚本文件__main__.py,将run.zip作为执行目标,结果显示脚本文件位于zip文件中。

zip/__main__.py
# 显示 sys.path 的第一个元素,他是 __main__.py 所在 zip 文件的路径
import sys
print(f'__main__.py 位于:{sys.path[0]}')
Windows
__main__.py 位于:\import_system\zip\run.zip
UNIX/Linux/macOS
__main__.py 位于:/import_system/zip/run.zip

在命令行中使用-c选项运行 Python 代码,显示模块搜索路径的第一项。

Windows
python -c "import sys;print(f'path[0] = [{sys.path[0]}]')"
path[0] = []
UNIX/Linux/macOS
python3 -c "import sys;print(f'path[0] = [{sys.path[0]}]')"
path[0] = []

环境变量 PYTHONPATH 中的目录

当你在操作系统中设置了环境变量PYTHONPATH后,该变量所包含的一系列目录或zip文件路径,将被添加至 Python 模块搜索路径。

Python 标准/扩展库目录

Python 自身拥有一个标准库,其中含有大量功能各异的标准模块,模块搜索路径需要包含该标准库的目录,以及标准库zip文件的路径。Python 扩展库提供标准库可能依赖的 API 支持,如果需要,扩展库的目录也会包含在模块搜索路径中。

Python 标准/扩展库在各操作系统中的位置

在 Windows 中,Python 标准库一般位于安装目录的Lib文件夹,标准库zip文件位于安装目录本身,扩展库位于安装目录的DLLs文件夹。

在 UNIX/Linux/macOS 中,Python 标准库可能位于lib/python<X>.<Y>,标准库zip文件位于lib,扩展库位于lib/python<X>.<Y>/lib-dynload。这里的lib一般是指/usr/lib,或同一位置的lib64X为 Python 主版本号,Y为次版本号。

如何查看 Python 标准/扩展库的位置?

当不能确定标准/扩展库的位置时,可以在 Python 的交互模式中,输入import syssys.prefixsys.exec_prefix几行代码,来显示其相关信息。其中sys.prefix对应了标准库目录,sys.exec_prefix对应了扩展库目录。

如果是py文件,则可以使用print函数在终端显示他们。

Windows
import sys
sys.prefix
''
sys.exec_prefix
''
UNIX/Linux/macOS
import sys
sys.prefix
'/usr'
sys.exec_prefix
'/usr'
print_prefix.py
# 显示标准/扩展库目录
import sys
print(sys.prefix)
print(sys.exec_prefix)

Python 第三方包目录

Python 模块搜索路径还将包括第三方包的目录,一般情况下,他指向一个名为site-packages的文件夹,其中包含自行构建或安装的 Python 包。

第三方包

要了解第三方包的具体位置,你可以查看Python 第三方包的位置一段。

Python pth 文件中的目录

如果第三方包文件夹包含任何的pth文件,则这些文件中按行列出的目录或zip文件路径,也将成为 Python 模块搜索路径的一部分。

Windows 注册表中的目录

在 Windows 系统中,注册表键HKEY_CURRENT_USER\Software\Python\PythonCore\<X>.<Y>\PythonPathHKEY_LOCAL_MACHINE\Software\Python\PythonCore\<X>.<Y>\PythonPath的默认值所包含的目录或zip文件路径,将被添加至模块搜索路径。上述中的X为 Python 主要版本号,Y为次要版本号。

内容分类

源码

print_path.py·codebeatme/python-reference·GitHub
run.py·codebeatme/python-reference·GitHub
zip/__main__.py·codebeatme/python-reference·GitHub
print_prefix.py·codebeatme/python-reference·GitHub