模块中的包的定义和使用
一.模块的搜索路径
模块的加载路径:内存==》内置模块==》sys.path(系统内置的环境变量,一系列自定义的模块)
import sys print(sys.path) #查询系统的环境变量,以列表的形式进行存储 # 默认第一个元素就是当前被执行的文件目录 # 我们可以自定义的去加入系统的配置 sys.path.append(r'想导入的模块的绝对路径') sys.path.insert(r'想导入的模块的绝对路径') # 可以添加到指定的位置
二.模块导入的指定的流程
''' 导入模块的指令: -- 相对于 函数名() 调用函数体,函数调用会进入函数体,从上至下逐句解释执行函数体代码 -- 导入模块,会进入模块文件,从上至下逐句解释执行模块文件代码 -- 如果在模块中又遇到导入其他模块,会接着进入导入的模块,从上至下逐句解释执行文件中代码,依次类推 '''
三.循环导入
所谓的循环的导入,实质上就是模块之间形成的环状调用,就比如说,模块一中需要模块二中的变量名,反之,模块二需要模块一的变量名,这就是循环导入。
循环导入会存在很多问题:
1.-- 导入模块是要使用模块中的变量
2.-- 正常逻辑都是在文件最上方先完成对模块的导入,再在下方定义自身模块变量,以及使用导入的模块中的变量
3.-- 由于导入模块的特殊机制,第一次导入模块会编译执行导入的模块,也就是会进入模块逐句执行模块内容,再次导入只是使用内存中的名字
4.-- 就会出现下面的情况,m2在使用m1中的变量x,但变量x却并未产生,这就出现了循环导入问题
列如:
m1.py文件 import m2 x = 10 print(m2.y) m2.py文件 import m1 y = 10 print(m2.x) # 针对循环导入的问题,我们可以采用延迟导入的方式来处理。 # 1.将循环导入的包中的变量名进行提前定义,再导入到相应的包中 # 2.将导入包的路径提前封装在一个函数中,保证在逻辑函数的调用在变 # 量定义之后 “”“ 重点: 问题:from导包极容易出现循环导入问题 解决:建议from导入方式改用import导入方式 “””
四.包的认识
包通过文件夹来管理一系列功能的相近的模块。
包:是一系列的模块的集合体。包中一定要有专门管理包的所有模块的文件。
包名:是存放一系列模块的文件夹名字,包名是存放的是管理模块的那个文件的地址,指向的是全局名称空间
五.包的导入
# 包的导入实质上是通过查找环境变量的绝对地址来完成导入的。 # 要注意的是: 1.导入的包的文件夹必须添加到环境变量里 2.导入的文件夹名就是包名 # 在导入包的文件夹中一定有__init__.py文件
六.导入模块和导入包相应完成的三件事
# 导如模块完成的三件事: 1.编译执行模块module.py文件,并相应的生成__pycache__文件。 2.在该模块中产生相应的global的全局名称空间 3.在该模块的全局名称空间中产生相应的一个变量名称空间 # 导入包完成的三件事: 1.编译执行包中的__init__.py文件,会在包中__pycache__创建对应的 pyc文件 2.产生__init__.py文件的全局名称空间,用来存放__init__出现的名字 3.产生包名指向__init__.py文件的全局名称空间 | 指定变量名指向包中指 定名字
七.模块的导入之import
''' 注意点: 1.在包__init__.py中不建议使用import导入 2、在包__init__.py中不建议使用as起别名 总结:不建议__init__.py中采用import管理名字 ==> 空着不写 在使用文件中 直接在要使用的文件中用import一层层找到你想要的名字 import 包名.文件名 as 别名 # 起完别名,原名不可以再使用 原名:包名.文件名 => 包名.文件名.变量名 别名:别名 => 别名.变量名 '''
八.包中的模块导入之绝对路径
# 在包的__init__文件中 import 模块名 # 问题:所属包不在环境变量,报错 import 包名.模块名 # 问题:包所属文件夹不在文件变量,报错 import 包名.模块名 as 别名 # 在外界:包名.模块名 | 包名.别名 都可以访问 import 包名.模块名.名字 # 问题:导包语句.语法左侧必须全部是包(文件夹) # 外界 import 包名 包名.名字 # 访问的是__init__中的名字 包名.模块 # 访问的模块这个地址 包名.模块.名字 # 访问的模块中的名字 import 包名.模块 包名.模块 # 访问的模块这个地址 包名.模块.名字 # 访问的模块中的名字 from 包名 import 模块 模块 # 访问的模块这个地址 模块.名字 # 访问的模块中的名字 from 包名.模块 import 名字 名字 # 访问的模块中的名字
九.包中导入模块之相对路径
# 没有子包 ''' 1) pk包 -- __init__.py -- 名字 a = 10 -- pkm.py -- 名字 b = 20 在外界 import pk pk.a 访问a pk.b 访问b init管理文件 a不需要操作 from .pkm import b ''' # 有子包 ''' 1) pk包 -- __init__.py sub子包 -- __init__.py 名字 x = 10 -- subm.py 名字 y = 10 在外界 import pk pk.x 访问x pk.y 访问y 在pk的init管理文件 from .sub import x from .sub.subm import y ''' ''' 2) pk包 -- __init__.py sub子包 -- __init__.py 名字 x = 10 -- subm.py 名字 y = 10 在外界 import pk pk.sub.x 访问x pk.sub.y 访问y 在pk的init管理文件:要产生sub名字 from . import sub => pk.sub 在sub的init管理文件:要产生x,y名字 x不需要操作 => pk.sub.x from .subm import y => pk.sub.y ''' # 注:有相对导入.语法的文件都不能自执行