导入模块的两个细节
1、跨文件夹导入模块
#1)如果a文件夹所在目录在环境变量里,a文件夹中的ma模块可以被以下方式导入
import a.ma | from a import ma
#2)如果a文件夹所在目录在环境变量里,a文件夹中的b文件夹的mb模块可以被以下方式导入
import a.b.mb | from a.b import mb
#3)如果a文件夹所在目录在环境变量里,a文件夹中的b文件夹的mb模块中的bbb名字要被直接导入
import a.b.mb.bbb #错误用法, 所有.的左边必须是文件夹
from a.b import mb.bbb #也是错误, 所有.的左侧必须是文件夹
from a.b.mb import bbb #正确
2、文件被执行的两种方式
-1、一个py文件作为自执行文件,__name__变量的值为'__main__'
-2、一个py文件作为模块被导入执行,__name__变量的值为模块的名字
#如何区分两种方式:一个文件可以自执行,也可以被导入执行 共存
#在这个py文件后面加上if判断语句
if __name__ == '__main__'
#自执行的逻辑代码 #这样的文件作为模块被导入时,__name__为模块名,不满足if条件,
#就不会执行自执行的逻辑
包
#一系列模块的集合体,用文件夹来管理一系列有联系功能的模块,该文件夹我们称之为包,文件夹名就是包名
包与普通文件夹的区别:包的文件夹一定存在一个__init__.py文件
--py2必须创建__init__.py文件
--py3可以不创建,系统会帮我们创建,但是如果想管理包里的模块,也是必须创建的
#__init__.py文件
1)产生一个全局名称空间,提供给包,就代表包的名称空间
2)管理 包可以直接点出来的使用的 名字
#导包完成的三件事
1)编译形成包中的__init__.py文件的pyc文件
2)执行__init__.py文件,形成一个全局名称空间,将__init__.py文件中所有的名字存放其中,该名称空间就代表包的名称空间
3)在导包的文件中产生一个与包名相同的名字,指向包的名称空间(__init__.py文件的全局名称空间)
直接使用包中的模块
如果只是想作为普通文件夹,py3中可以省路__init__.py文件,本质上文件夹也是包
导入的手段:1、指名道姓到某一个模块 | 2、指名道姓到某一模块中的名字
(直接使用的话就相当于上面的跨文件夹导入模块)
包的管理
#在包中采用相对导入来管理模块或者模块中的名字
相对导入:导入语句中用.代替某些路径的导入方式就是相对导入
--相对导入不依赖于sys.path
#在包的__init__.py文件或是包中任意一个模块中
#.代表的是当前文件所在目录
#..代表的是上一级文件的所在目录,可以通过..在上一级的目录里导模块,但是..不能出包的目录
注:.语法不能出包,因为包外的文件都能自执行,但是拥有.开头导入的文件不能自执行,只能通过别人导入执行