import如何工作
导入其实是运算时的运算,程序第一次导入指定文件时,会执行三个步骤。
1、搜索:找到模块文件
2、编译:编译成位码(需要时)
3、执行模块的代码来创建其所定义的对象。
从技术上讲,Python把载入的模块存到一个名为sys.modules的表中,并在一次导入操作的开始检查该表。如果模块不存在,将会启动三个步骤的过程。
1、搜索
路径和后缀是可以省略掉的,因为Python使用了标准模块搜索路径来找出import语句所对应的模块文件。
2、编译(可选)
Python会检查文件的时间戳,如果发现字节码文件比源代码文件旧,就会在程序运行时自动重新生成字节代码。另一方面,如果发现.pyc字节码文件不必对应的.py文件旧,就会跳过源代码到字节码的编译步骤。此外如果程序只发现了字节码文件,而没有源代码,就会直接加载字节码(这意味着你可以把一个程序只作为字节码文件发布,而避免发布源代码)。换句话说,如果有可能使程序的启动提速,就会跳过编译步骤。
注意:当文件被导入时,就会进行编译。因此,通常看不到顶层文件的.pyc字节码文件,除非这个文件也被其它文件导入:只有被导入的文件才会在机器上留下.pyc。顶层文件的字节码文件是在内部使用后就被丢弃了。
3、运行
pass
模块搜索路径
1.程序的主目录
2.PYTHONPATH目录(如果已经进行了设置)
3.标准链接库目录
4.任何.pth文件的内容(如果存在的话)
最后,这四个组件组合起来就变成了sys.path。搜索路径的第一和第三元素时自动定义的,第二和第四元素,就可以用来扩展路径,从而包含你自己的源代码目录。
主目录
顶层文件所在的目录,程序首先搜索这个目录。由于这个目录是先被搜索的,所以其文件也将覆盖路径上其他目录中具有相同名称的模块。
PATHONHPATH
之后,Pthon会从左至右搜索PYTHONPATH环境变量设置中罗列出来的所有目录。你可以把想导入的目录都加进来。
标准库目录
接着,Python会自动搜索标准库模块安装在机器上的那些目录。
.pth
是PYTHONPATH的一种替代方案,允许用户把有效的目录添加到模块搜索路径中去,也就是在后缀名为.pth的文件中一行一行的列出目录。