前言
本文介绍了python中的包结构和导入的相对路径等包的基础问题.
1.包导入
python代码的目录就成为包,因此,这类导入就成为包导入。事实上,包导入是把计算机上的目录变成另一个python命名空间,而属性则对应于目录中所包含的子目录和模块文件。
python代码的目录就成为包,因此,这类导入就成为包导入。事实上,包导入是把计算机上的目录变成另一个python命名空间,而属性则对应于目录中所包含的子目录和模块文件。
2.包导入基础
在import语句中列举简单文件名的地方,可以改成列出路径的名称,彼此以点号相隔。
import dir1.dir2.mode
这些语句中的“点号”路径是对应于机器上目录层次的路径,通过这个路径可以找到mode.py
文件。
3. __ init__.py
包文件
使用包导入时,必须遵照一条约束:包导入语句的路径中的每个目录内都必须有__init__.py
文件,否则包导入失败。即import dir1.dir2.mode
必须遵守下列规则:
-
dir1
和dir2
中都必须有一个__init__.py
文件 -
dir0
是容器,不需要__init__.py
文件,如果有的话,也会被忽略 -
dir0
必须在模块搜索路径上。
即包的结构如下所示
dir0\
dir1\
__init__.py
dir2\
__init__.py
mode.py
4.__init__.py
文件作用
__init__.py
文件的作用有三个:包初始化,替目录产生模块命名空间以及使用目录导入时实现from *
4.1包的初始化
python首次导入某个目录时,会自动执行该目录下的__init__.py文件中的所有程序代码,因此这类文件自然就是放置包内文件所需要初始化的代码的地方。例如,可以用来初始化文件,创建需要的数据文件,链接数据库等。一般来说,单独直接执行__init__.py文件没有什么用,当包首次读取时,就会直接运行
4.2模块命名空间初始化
在包的导入模型中,脚本的目录路径,在导入后会变成真实的嵌套路径对象。
4.3from *
语句的行为
在__init__.py
文件中,__all__
列表指当包(目录)名称使用from *
的时候,应该导入的子模块的名单清单。如果没有指定__all__
,from *
语句不会加载嵌套于该目录的子模块。取而代之的是,只加载该目录的__init__.py
文件中赋值语句定义的变量,包括该文件中程序代码明确导入的任何子模块。
5.包相对导入
假设有这样一个包dir0
,其子模块的结构如下所示:
dir0\
dir1\
mode1.py
dir2\
mode2.py
dir3\
mode3.py
当前处于mode2.py
文件中。则有下面的操作:
from .dir3 import mode3
表示从当前执行目录(当前目录,即dir2
)的子目录(即dir13
)中搜索,mode3
模块 。
.
代表`dir0\dir1\dir2“`
from . import mode2.mode3
表示从执行程序的目录(当前目录,即dir2
)搜索当前目录,即mode2
mode3
模块
.
代表dir0\dir1\dir2
from .. import mode1 mode2
表示从当前执行目录(当前目录,即dir2
)的父目录(即dir1
)中搜索,mode1
mode2
模块
..
代表dir0\dir1\