模块导入逻辑
import module
module.xxx
from imp import reload
reload(module)
module.xxx
包和搜索路径设置
- python不支持用绝对路径导入包: import C:\mycode\dir\mod 这么导入会报错
- 如果模块不在可搜索的工作目录,可以使用相对路径: import dir1.dir2.mod
- 每个非根目录的目录下必须有一个__init__.py文件
- dir1.dir2.mod的导入路径应该是这样的
dir0\
dir1\
__init__.py
dir2\
__init__.py
mod.py
- init.py文件可以用python程序,也可以是全空的,扮演了包初始化的钩子
- 当包被导入的时候,会自动执行目录下__init__.py的所有的程序,来创建程序所需要的数据文件 连接数据库等
from *语句
- 在__init__.py中使用__all__列表来定义使用from * 语句时,需要导出什么
小demo
#分别有三个文件
# dir1\__init__.py
print('dir1 init')
x = 1
# dir1\dir2\__init__.py
print('dir2 init')
y = 2
# dir1\dir2\mod.py
print('in mod')
z = 3
print("------第一次运行---------")
import dir1.dir2.mod
print("------第二次运行---------")
import dir1.dir2.mod
from importlib import reload
print("------第三次运行---------")
reload(dir1)
reload(dir1.dir2.mod)
# ------第一次运行---------
# dir1 init 模块导入的时候会自动执行导入路径中init文件中的代码
# dir2 init
# in mod 导入目标模块时会先运行一次模块代码
# ------第二次运行--------- 模块已经导入一次,再次导入不会生效
# ------第三次运行--------- 重载后,目标模块重载,但执行过程中的init不会重载
# dir1 init
# in mod
# 调用模块中的变量
print(dir1.x,dir1.dir2.y,dir1.dir2.mod.z) # 1 2 3
# from...import的灵活调用
from dir1.dir2 import mod
print(mod.z)
from dir1.dir2.mod import z
print(z)
import dir1.dir2.mod as t
print(t.z)
import as
import module as name
# 想当于import module ; name = module;del module