模块:代码复用、命名空间的划分、数据共享。
模块导入:首次【找到对应的模块、编译成字节码、执行模块代码在内存中创建它的对象】,再次【内存中直接提取对象】。
模块导入后存储在sys.modules中【字典式存储】。
模块搜索:从当前路径开始查找,查找顺序:当前目录、PYTHON-PATH环境变量、标准库目录、.pth文件目录【sys.path】。
模块编译:生成字节码,加载时检查字节码时间戳,最新则跳过编译【主程序字节码运行完抛弃,加载模块保留方便高效加载】。
模块运行:执行生成的字节码,语句依次执行。
模块类型:源代码文件py、字节码文件pyc、目录【包导入】、C扩展模块【.so和dll、pyd】、等等。
程序:控制启动流程加载模块。本程序名为module,加载模块为module1。
import module、from module import name1,name2 == import module,name1=module.name1,name2=module.name2,del module ;
form module import name :本地变量会覆盖模块的变量、模块调用过多难以区分变量来自哪个模块,可读性差。
模块程序不可读取其它模块中的变量。
读取两个程序中相同的变量,必须使用from...import...。
模块包导入类似操作:必须存在sys.path中
module1:
#模块可实现全局变量、函数定义、函数调用
a=3#全局变量
def func():
b=4
print("module test","module1_a=%d,mod`ule1_lb=%d"%(a,b))
func()
module2:
aaa=1
def functest(*args):
print(list(args))
module3:模块包-必须存在在sys-path中
bbb=1
def functest(*args):
print(list(args))
module_main:
import sys
from importlib import reload
import module1#导入模块名module
from module2 import functest#导入模块module2中的某个属性,直接调用此属性 == 【from module2 import *】
import dir.dir1.module3 as module_name #包导入:as起别名 【from dir.dir1.module import functest】
#from. import func 相对导入。。
a=33#程序的全局变量
print(module1.a,a)#调用模块中的全局变量和本地的全局变量,可以重名
module1.a=44#可以修改模块中的全局变量
module1.func()#调用模块中的函数【模块的属性】属性a值已经改变位44
reload(module1)#重载模块,还是之前的值
if 'module1' in list(sys.modules.keys()):print("module1 in modules ")#取出modules中的key值并列表化,用于判断模块是否加载
functest("module2_","test")#直接调用module2中的函数
#print(sys.path)
module_name.functest("123")#包导入调用
D:\py\venv\Scripts\python.exe D:/py/module_main.py
module test module1_a=3,module1_b=4
3 33
module test module1_a=44,module1_b=4
module test module1_a=3,module1_b=4
module1 in modules
['module2_', 'test']
['123']
Process finished with exit code 0