Python 模块搜索路径介绍,模块搜索路径中的目录有哪些
关注 1800
本节所讲述的 Python 模块搜索路径,同样适用于包,因为包是特殊的模块。
Python 模块搜索路径
Python 模块搜索路径(Module Search Path)用于搜索需要载入的模块,在 Python 启动后,他与sys模块的path变量是等同的。
模块搜索路径并非单一的路径,这一点和环境变量PATH类似,他可以指向多个包含模块的文件夹,或zip压缩文件。此外,搜索路径可以包含绝对路径或相对路径,比如,''是一个表示当前目录的相对路径。
如何查看模块搜索路径?
在交互模式中,输入并执行import sys和sys.path两行代码,即可查看sys.path表示的模块搜索路径。如果是py文件,则可将sys.path替换为print(sys.path)。
import sys
sys.path
['', '…\\python312.zip', '…', '…\\Lib', '…\\Lib\\site-packages']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']# 显示 sys.path 表示的 Python 搜索路径
import sys
print(sys.path)模块搜索路径的优先级
在sys模块中,保存模块搜索路径的变量path是一个列表对象,其第一个元素表示的路径,首先被用于模块的搜索,如果模块不存在则使用下一个元素,直至模块被找到或抵达列表末尾。
Python 模块搜索路径中的目录
模块搜索路径一般包含以下几种类别的目录,被运行目标所在的目录或当前工作目录,环境变量包含的目录,标准/扩展库目录,第三方包目录,pth文件中的目录,以及 Windows 注册表中的目录。
Python 脚本目录或当前目录
当你使用 Python 运行脚本文件时,模块搜索路径的第一项是脚本文件所在的目录。当执行包含__main__.py的文件夹或zip文件时,模块搜索路径的第一项为文件夹或zip文件所在的目录。
如果未指定运行目标,那么模块搜索路径的第一项为当前工作目录,该目录可能表述为相对路径''。当你在命令行输入python或python3进入 Python 交互模式,或使用-c选项执行代码,-m选项执行模块时,搜索路径的第一项等价于命令行的当前目录。
脚本文件run.py显示了搜索路径的第一个元素,在使用命令行运行该文件后,我们将看到run.py所在的目录。
# 显示 sys.path 的第一个元素,他是该脚本文件所在的目录
import sys
print(f'脚本位于:{sys.path[0]}')脚本位于:…\import_system脚本位于:…/import_system压缩文件run.zip包含脚本文件__main__.py,将run.zip作为执行目标,结果显示脚本文件位于zip文件中。
# 显示 sys.path 的第一个元素,他是 __main__.py 所在 zip 文件的路径
import sys
print(f'__main__.py 位于:{sys.path[0]}')__main__.py 位于:…\import_system\zip\run.zip__main__.py 位于:…/import_system/zip/run.zip在命令行中使用-c选项运行 Python 代码,显示模块搜索路径的第一项。
python -c "import sys;print(f'path[0] = [{sys.path[0]}]')"
path[0] = []python3 -c "import sys;print(f'path[0] = [{sys.path[0]}]')"
path[0] = []环境变量 PYTHONPATH 中的目录
当你在操作系统中设置了环境变量PYTHONPATH后,该变量所包含的一系列目录或zip文件路径,将被添加至模块搜索路径。
Python 标准/扩展库目录
Python 自身拥有一个标准库,其中含有大量功能各异的标准模块,模块搜索路径需要包含该标准库的目录,以及标准库zip文件的路径。Python 扩展库提供标准库可能依赖的 API 支持,如果需要,扩展库的目录也会包含在模块搜索路径中。
标准/扩展库在各操作系统中的位置
在 Windows 中,Python 标准库一般位于安装目录的Lib文件夹,标准库zip文件位于安装目录本身,扩展库位于安装目录的DLLs文件夹。
在 UNIX/Linux/macOS 中,标准库可能位于lib/python<X>.<Y>,标准库zip文件位于lib,扩展库位于lib/python<X>.<Y>/lib-dynload。这里的lib一般是指/usr/lib,或同一位置的lib64,X为 Python 主版本号,Y为次版本号。
如何查看标准/扩展库的位置?
当不能确定标准/扩展库的位置时,可以在交互模式中输入import sys,sys.prefix,sys.exec_prefix几行代码,来显示其相关信息。其中sys.prefix对应了标准库目录,sys.exec_prefix对应了扩展库目录。
如果是py文件,则可以使用print函数在终端显示他们。
import sys
sys.prefix
'…'
sys.exec_prefix
'…'import sys
sys.prefix
'/usr'
sys.exec_prefix
'/usr'# 显示标准/扩展库目录
import sys
print(sys.prefix)
print(sys.exec_prefix)Python 第三方包目录
模块搜索路径还将包括第三方包的目录,一般情况下,他指向一个名为site-packages的文件夹,其中包含自行构建或安装的包。
第三方包
要了解第三方包的具体位置,你可以查看Python 第三方包的位置一段。
pth 文件中的目录
如果第三方包文件夹包含任何的pth文件,则这些文件中按行列出的目录或zip文件路径,也将成为模块搜索路径的一部分。
Windows 注册表中的目录
在 Windows 系统中,注册表键HKEY_CURRENT_USER\Software\Python\PythonCore\<X>.<Y>\PythonPath,HKEY_LOCAL_MACHINE\Software\Python\PythonCore\<X>.<Y>\PythonPath的默认值所包含的目录或zip文件路径,将被添加至模块搜索路径。上述中的X为 Python 主要版本号,Y为次要版本号。
内容分类
源码
讲解视频
如何解决 Python 找不到导入模块的问题?“ModuleNotFoundError No module named”错误分析·YouTube如何解决 Python 找不到导入模块的问题?“ModuleNotFoundError No module named”错误分析·Bilibili