只有文件夹下面加上 _init_.py 文件,这个文件夹才算是一个包,运行包会优先执行_init_.py文件
1、引入模块
import,需要引用其他模块的变量,可使用import
引入函数与变量
from module_b.n1 import a
print(a)
从某模块引入
from module_b import n1
print(n1.a)
引入所有变量
from module_b.n1 import *——引入所有的变量。
注:如果执行导入部分模块,可在n1文件中加入__all__ = ['a','b'],这个时候就只是导入了a、b两个变量
# 引入所有变量
from module_b.n1 import *
print(a,b,c)
引入多个变量或者模块
# 引入多个变量或者模块时,\换行
from module_b.n1 import a,b,\
c
# 引入多个变量或者模块时,()换行
from module_b.n1 import (a,b,
c)
注意事项
import导入,避免循环导入,或者间接循环导入模块,例如a模块导入b模块,b模块导入a模块
import导入,当a导入了b模块,执行a模块,也会执行b模块所有的代码
2、__init__.py介绍
1、包,相当于一个文件夹,成为一个包,需要增加一个特殊文件,__init__.py文件,这个模块命名就是包名
2、import导入包后或者模块,以及变量,在执行被导入py文件时,会自动执行__init__.py文件。
例如:将b包导入到c包中,执行c包的文件中,会优先自动执行b中的__init__.py文件
3、当一个包中,多个py文件需要引用多个库时,可在__init__.py加入需要导入的库,供其他py文件使用
例如:
在二级目录packag_b包中的__init__.py文件中,导入3个库
在一级目录packag_a包中的m1.py文件中使用sys库
3、模块中的内置变量
1、通过dir方法查询模块内置变量,例如:print(dir())
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
在导入包时,使用dir(),加入参数可以查看包中所有变量,例如dir(sys)
2、当a模块调用b模块时,可通过内置变量可查询内容如下:
__name__,查询调用模块名称
__package__,查询调用模块的包
__doc__,查询调用模块注释
__file__,查询调用模块的py文件路径
例如:
在a包n1.py模块下,查询变量内容
使用b包的m3.py模块作为可执行入口文件,调用a包的n1.py模块
print('调用模块变量内容')
import package_b.n1
print('\n'+'分界线'.center(50,'#')+'\n')
print('可执行文件,当前模块变量内容')
print('name:'+__name__)
print('package:'+(__package__ or '当前模块不属于任何包'))
print('doc:'+(__doc__ or '当前模块没有文档注释'))
print('file:'+__file__)
结果
调用模块变量内容
package_b.n1
name:package_b.n1
package:package_b
doc: package_b
file:/Users/zhangchen/Downloads/Py_study/package_a/package_b/n1.py
#######################分界线########################
可执行文件,当前模块变量内容
name:__main__
package:当前模块不属于任何包
doc:当前模块没有文档注释
file:/Users/zhangchen/Downloads/Py_study/package_a/m3.py
4、注意事项
通过在py文件中加入if __name__ == '__main__':语句,作为当前文件为可执行文件,也可以作为模块,当a模块放入此语句时,在b模块中调用a模块,执行b模块时,此语句下的编码不会被执行
使用python3 -m module_b.n1.py,可以将可执行文件当做模块使用
顶级包的概念——是可执行文件同级包的顶层
使用".",导入相对路径的变量,例如from .m3 import m
注:入口文件不能使用相对路径导入,如果想执行模块需要使用命令python3 -m
9.当多个模块需要引用同一个内置库,可以在__init__.py文件中直接导入,包下的模块都能使用
在__init__.py文件下,引入需要导入内置库。
在其他模块引用是,只需要import+包名,就可以调内置库里的变量