python中的import操作有点类似于C语言中的#include,但又有很大的不同。在c语言中,#include是编译前将另一个文件包含进当前文件中。在python中导入并非只把一个文件文本插入另一个文件而已。
导入其实是运行时的运算,程序第一次导入时会执行三个步骤。
1 找到模块文件
2 在需要时编译成位码
3执行模块的代码来创建其所定义的对象
这三个步骤只有在模块第一次被导入的时候才会执行,之后导入相同模块的时候会跳过这三个步骤,而只提取内存中所加载的模块对象。
python会把载入的模块存储到一个名为sys.modules的表中,导入模块时会检查这个表,如果模块在表中存在则不会启动上面的三个步骤。
import语句后所引用的模块文件没有文件路径,也没有文件后缀。那python是如何找到模块并将其导入文件的呢?
原来python有一个sys.path系统变量,这个变量存储了import语句的搜索路径。这个搜索路径主要由四个部分组成:
1 程序的主目录
2 PYTHONPATH目录
3 标准链接库目录
4 任何.pth文件的内容
import文件的后缀是刻意从import语句中省略的。python会在搜索路径中选择第一个符合导入文件名的文件。
此外 import还可以利用钩子程序让import在导入文件时做各种有用的事情。具体的钩子函数就是内置的__import__函数,具体用法见相关手册。
原文地址:http://9425336.blog.51cto.com/9415336/1559459