python中间模块重载介绍

python通过reload重载模块动态更新最新代码。
1.1 reload用法
import modafrom importlib import reloadreload(moda)描述
python的reload()函数需先从importlib导入。
reload**( moda )****:**moda为模块对象,即需先导入moda才能进行reload。
假设模块a文件,导入了模块b和c,那么重载模块a的时候,不会重载b和c。
需要单独对中间模块b和c进行重载。
文件内容
e**:**\\documents\\f盘\\testreload.py
import os,sysimport modbimport modcprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))# a='梯阅线条' # 修改前a='梯阅线条a' # 修改后print(a={}.format(a))e**:**\\documents\\f盘\\modb.py
import os,sysprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))# b='b' # 修改前b='bb' # 修改后print(b={}.format(b))e**:**\\documents\\f盘\\modc.py
import os,sysprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))# c='c' # 修改前c='cc' # 修改后print(c={}.format(c))示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python>>> import testreloadrun:e:\\documents\\f盘\\modb.py__name__:modbb=brun:e:\\documents\\f盘\\modc.py__name__:modcc=crun:e:\\documents\\f盘\\testreload.py__name__:testreloada=梯阅线条# 修改a=’梯阅线条a’,b=’bb’,c=’cc’>>> from importlib import reload>>> reload(testreload)run:e:\\documents\\f盘\\testreload.py__name__:testreload# 后只更新了reload 模块内容a=梯阅线条a# 未更新中间模块内容>>> testreload.modb.b'b'>>> testreload.modc.c'c'# 单独reload 中间模块,内容更新成功>>> reload(testreload.modb)run:e:\\documents\\f盘\\modb.py__name__:modbb=bb>>> reload(testreload.modc)run:e:\\documents\\f盘\\modc.py__name__:modcc=cc>>> testreload.modb.b'bb'>>> testreload.modc.c'cc'>>>1.2 自动重载中间模块描述
通过遍历模块属性字典 dict ,对类型type为模块的属性,进行重载。
对中间模块再导入的中间模块,也调用此方法进行重载,即递归重载。
从而达到自动重载中间模块。
文件内容
e**:**\\documents\\f盘\\testreload.py
import os,sysimport typesimport modbimport modcfrom importlib import reloadprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))#a='梯阅线条' # 修改前a='梯阅线条a' # 修改后print(a={}.format(a))def reload_status(mod,lev,lastmod): print('reloading:'+ str(lev) + '-'*lev + mod.__name__ + '(in {})'.format(lastmod.__name__)) def reload_conv(mod,convd,lev,lastmod): if not mod in convd: reload_status(mod,lev,lastmod) reload(mod) convd[mod]=none for attr in mod.__dict__.values(): if type(attr)==types.moduletype: reload_conv(attr,convd,lev+1,mod) def reload_all(*args): convd={} for arg in args: if type(arg)==types.moduletype: reload_conv(arg,convd,0,arg) if __name__ == '__main__': import testreload reload_all(testreload)e**:**\\documents\\f盘\\modb.py
import os,sysprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))# b='b' # 修改前b='bb' # 修改后print(b={}.format(b))e**:**\\documents\\f盘\\modc.py
import os,sysprint(run:{}.format(os.path.abspath(__file__)))print(__name__:{}.format(__name__))# c='c' # 修改前c='cc' # 修改后print(c={}.format(c))示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python>>> import testreloadrun:e:\\documents\\f盘\\modb.py__name__:modbb=brun:e:\\documents\\f盘\\modc.py__name__:modcc=crun:e:\\documents\\f盘\\testreload.py__name__:testreloada=梯阅线条# 修改a=’梯阅线条a’,b=’bb’,c=’cc’# 调用 reload_all 自动重载中间模块>>> testreload.reload_all(testreload)reloading:0testreload(in testreload)run:e:\\documents\\f盘\\testreload.py__name__:testreload# 更新reload的模块内容a=梯阅线条a# 展示模块层级关系,数字大的为小的中间模块,in 为导入当前模块的文件模块reloading:1-os(in testreload)reloading:2--abc(in os)reloading:2--sys(in os)reloading:2--stat(in os)reloading:2--ntpath(in os)reloading:3---genericpath(in ntpath)reloading:1-types(in testreload)reloading:1-modb(in testreload)run:e:\\documents\\f盘\\modb.py__name__:modb# 更新中间模块内容b=bbreloading:1-modc(in testreload)run:e:\\documents\\f盘\\modc.py__name__:modcc=cc

14.5 英寸拯救者 Y900 机皇平板震撼登场
科技,助力“智慧法治” :华为亮相2023政法装备展
ivvi手机终放弃手机市场,投入3D行业?
微雪电子OV5648高清USB摄像头简介
网约车合法后,你必须了解的...
python中间模块重载介绍
小米MIUI8体验评测:小功能360度全面解析
“物联网平台+”战略实现物联网全国覆盖
浅谈汽车的影像技术的未来发展
Vivado DDR4仿真操作
CC2530F256RHAR Zigbee物联网2.4G无线射频收发RF芯片
分布式数据恢复-hbase+hive分布式存储误删除文件的数据恢复方案
信步科技SV-IPC-Q374U嵌入式主板介绍
Maxim Integrated推出业内唯一的高集成度八通道超声收发器
多功能智能投影仪,开启办公室科技新时代
一加5曝光:一加5全方位细节对标三星S8,性能怪兽花落谁家?
苹果离子风散热技术或有望取代传统机械风扇
荣耀智慧屏和智能电视到底有什么区别
三星将推出GalaxyS10和Note 10的廉价版
USB 总线的转接芯片,实现 USB 转异步串口,国产USB转单串口CH9101,PIN替代FT230/FT232/PL2303/CY7C65213