模块搜索路径
概括地讲,Python的模块搜索路径是这些主要组件组合而成的结果。其中有些进行了预先定义,而其中有些你可以进行调整来告诉Python去哪里搜索。
1. 程序的主目录
2. PYTHONPATH目录(如果已经进行了设置)
3. 标准链接库目录
4. 任何.pth文件的内容(如果存在的话)。
最后,这四个组件组合起来就变成了sys.path,它是目录名称字符串的列表。搜索路径的第一和第三元素是自动定义的,但是因为Python会从头到尾搜索这些组件组合的结果,第二和第四元素,就可以用于扩展路径,从而包含你自己的源代码目录。
PYTHONPATH目录
Python会从左至右(假设你设置了的话)搜索PYTHONPATH环境变量设置中罗列出的所有目录。简而言之,PYTHONPATH是设置包含Python程序文件的目录的列表,这些目录可以是用户定义的或平台特定的目录名。你可以把想导入的目录都加进来,而Python会使用你的设置来扩展模块搜索的路径。
因为Python会先搜索主目录,当导入的文件跨目录时,这个设置才显得格外重要。也就是说,如果你需要被导入的文件与进行导入的文件处在不同目录时。
sys.path列表
如果你想看看模块搜索路径在机器上的实际配置,可以通过打印内置的sys.path列表(也就是标准模块sys的path属性)来查看这个路径,就好像Python知道一样。目录名称字符串列表就是Python内部实际的搜索路径。导入时,Python会由左至右搜索这个列表中的每个目录。
其实,sys.path是模块搜索的路径。Python在程序启动时进行配置,自动将*文件的主目录(或者指定当前工作目录的一个空字符串)、任何PYTHONPATH目录、已经创建的任何.pth文件路径的内容,以及标准库目录合并。结果是Python在每次导入一个新文件的时候查找目录名的字符串的列表。
import sys
print(sys.path)
模块文件的选择
记住,文件名的后缀(例如,.py)是刻意从import语句中省略的。Python会选择在搜索路径中第一个符合导入文件名的文件。例如,import b形式的import叙述可能会加载
源代码文件b.py
字节码文件b.pyc
目录b,包导入
编译扩展模块(通常用C或C++编写),导入时使用动态连接(例如,Linux的b.so以及Cygwin和Windows的b.dll或b.pyd)。
用C编写的编译好的内置模块,并通过静态连接至Python