一.import 如何工作
在Python中,导入并非是把一个文件文本插入另一个文件,导入实际上是运行时的运算。 当程序第一次导入指定文件时,会执行以下三个步骤:- 找到模块文件
- 编译成位码(即.pyc文件)
- 执行模块的代码来创建其所定义的对象
关于搜索
Python会在先后在下面四个路径查找- 程序的主目录
- PYTHONPATH目录
- 标准链接库目录
- 任何的.pth文件的内容
sys.path
来查看以上四个路径的集合
关于编译成位码
1.在模块导入时,会生成一个.pyc文件。2.Python会自动检查文件的时间戳,来判断需不需要重新生成字节码.
3.如果Python在搜索路径上只发现了字节码文件,而没有源代码,就会直接加载字节码。(这意味着我们可以把一个程序只作为字节码发布,而避免发送源代码)
关于执行
import操作最后的步骤是执行模块的字节码。如果模块中有print语句就会显示输出.二.模块包
1.除了模块名以外,导入也可以指定目录路径。Python代码的目录就称为包.2.包导入语句的路径中的每个目录内都必须有__init__.py文件。
例如这样的目录结构:
dir0\dir1\dir2\mod.py
必须遵循以下规则:
- dir1和dir2中都必须含有一个__init__.py文件
- dir0是容器,不需要__init__.py文件;如果有也会被忽略
- dir0必须在模块搜索路径上(即
sys.path
中)
- Python首次导入某个目录时,会自动执行该目录下__init__.py文件中的所有程序代码(在交互式环境下,只有第一次import会执行;直接编译文件的方式,每次都会执行__init__.py)。
- 一般我们可以把连接数据库的操作放在__init__.py文件中。
三.相对导入和绝对导入
- 通过from . import 来实现相对导入,不带.则会直接在sys.path中的路径中查找
- .表示当前目录,..表示上一级目录
- 程序的入口所在的那一层目录不能被视作包
- 相对导入只能在包中使用,即程序入口那一层不能使用相对导入