0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python中间模块重载介绍

jf_78858299 来源:梯阅线条 作者:小梯子 2023-02-21 11:16 次阅读

python通过reload重载模块动态更新最新代码。

1.1 reload

用法

import moda
from importlib import reload
reload(moda)

描述

python的reload()函数需先从importlib导入。

reload**( moda )****:**moda为模块对象,即需先导入moda才能进行reload。

假设模块A文件,导入了模块B和C,那么重载模块A的时候,不会重载B和C。

需要单独对中间模块B和C进行重载。

文件内容

E**:**\\documents\\F盘\\testreload.py

import os,sys
import modb
import modc

print("run:{}".format(os.path.abspath(__file__)))
print("__name__:{}".format(__name__))
# a='梯阅线条' # 修改前
a='梯阅线条a' # 修改后
print("a={}".format(a))

E**:**\\documents\\F盘\\modb.py

import os,sys
print("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,sys
print("run:{}".format(os.path.abspath(__file__)))
print("__name__:{}".format(__name__))

# c='c' # 修改前
c='cc' # 修改后
print("c={}".format(c))

示例

# 打开cmd 执行下面示例
E:\\documents\\F盘>python
>>> import testreload
run:E:\\documents\\F盘\\modb.py
__name__:modb
b=b
run:E:\\documents\\F盘\\modc.py
__name__:modc
c=c
run:E:\\documents\\F盘\\testreload.py
__name__:testreload
a=梯阅线条
# 修改a=’梯阅线条a’,b=’bb’,c=’cc’
>>> from importlib import reload
>>> reload(testreload)
run:E:\\documents\\F盘\\testreload.py
__name__:testreload
# 后只更新了reload 模块内容
a=梯阅线条a
 'testreload' from 'E:\\\\documents\\\\F盘\\\\testreload.py'>
# 未更新中间模块内容
>>> testreload.modb.b
'b'
>>> testreload.modc.c
'c'
# 单独reload 中间模块,内容更新成功
>>> reload(testreload.modb)
run:E:\\documents\\F盘\\modb.py
__name__:modb
b=bb
 'modb' from 'E:\\\\documents\\\\F盘\\\\modb.py'>
>>> reload(testreload.modc)
run:E:\\documents\\F盘\\modc.py
__name__:modc
c=cc
 'modc' from 'E:\\\\documents\\\\F盘\\\\modc.py'>
>>> testreload.modb.b
'bb'
>>> testreload.modc.c
'cc'
>>>

1.2 自动重载中间模块

描述

通过遍历模块属性字典 dict ,对类型type为模块的属性,进行重载。

对中间模块再导入的中间模块,也调用此方法进行重载,即递归重载。

从而达到自动重载中间模块。

文件内容

E**:**\\documents\\F盘\\testreload.py

import os,sys
import types
import modb
import modc
from importlib import reload

print("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,sys
print("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,sys
print("run:{}".format(os.path.abspath(__file__)))
print("__name__:{}".format(__name__))

# c='c' # 修改前
c='cc' # 修改后
print("c={}".format(c))

示例

# 打开cmd 执行下面示例
E:\\documents\\F盘>python
>>> import testreload
run:E:\\documents\\F盘\\modb.py
__name__:modb
b=b
run:E:\\documents\\F盘\\modc.py
__name__:modc
c=c
run:E:\\documents\\F盘\\testreload.py
__name__:testreload
a=梯阅线条
# 修改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=bb
reloading:1-modc(in testreload)
run:E:\\documents\\F盘\\modc.py
__name__:modc
c=cc
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62616
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68609
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84687
收藏 人收藏

    评论

    相关推荐

    动态库封装成python模块的方法

    之前的文章 将静态库封装成 python 模块中讲解了如何将静态库封装成 python 模块,静态库封装相对来说还是有点复杂,今天来介绍下动
    发表于 07-13 15:24 646次阅读

    python教程之如何使用XlsxWriter模块创建aexcel表格

    本文档的主要内容详细介绍的是python教程之如何使用XlsxWriter模块创建aexcel表格。
    发表于 01-18 17:01 10次下载
    <b class='flag-5'>python</b>教程之如何使用XlsxWriter<b class='flag-5'>模块</b>创建aexcel表格

    Python的函数文件与模块的程序说明

    “探索Python ” 这一系列的前几篇文章已为Python 编程新手介绍了几方面的主题, 包括变量、容器对象和复合语句。本文以这些概念为基础,构造一个完整的Python 程序。引入了
    发表于 09-10 16:06 2次下载
    <b class='flag-5'>Python</b>的函数文件与<b class='flag-5'>模块</b>的程序说明

    Python-模块与包

    模块Python 程序架构的一个核心概念
    的头像 发表于 02-16 14:55 777次阅读
    <b class='flag-5'>Python</b>-<b class='flag-5'>模块</b>与包

    python重载运算符init和str介绍

    python模块都有个内置属性**name**。
    的头像 发表于 02-21 10:33 679次阅读

    python模块属性及字符串导入模块介绍

    python可以通过点号或字典,获取模块属性。 已经导入的模块存放在sys.modules字典,通过getattr获取模块属性
    的头像 发表于 02-21 11:27 746次阅读

    python模块相对导入from和import介绍1

    无包文件**init**.py下,python通过import module导入模块时,先搜索程序运行主目录。 程序运行主目录为运行的py文件所在目录,而不是执行python.exe时所在目录。
    的头像 发表于 02-21 14:15 1036次阅读

    Python的组成和缩进介绍

    1. Python组成和缩进 Python程序由模块组成。一个模块对应python源文件,一般后缀名是:.py
    的头像 发表于 03-05 17:09 1750次阅读
    <b class='flag-5'>Python</b>的组成和缩进<b class='flag-5'>介绍</b>

    介绍Python模块的基础知识

    Python是一种高级编程语言,拥有丰富的库和模块模块Python中一个独立的、可重用的代码单元,它包含了一组相关的函数、类和变量。
    的头像 发表于 04-21 16:48 997次阅读

    Python中telnetlib模块的基本使用

    telnetlib 是 Python 标准库中的一个模块,它提供了 Telnet 协议的客户端功能。使用 telnetlib 模块,我们可以在 Python 中编写脚本来自动化 Tel
    的头像 发表于 05-04 14:27 8109次阅读

    模块重载的五种方法

    bar >> > 重载模块方法一 如果你使用的 python2(记得前面在 foo 文件夹下加一个 __init__.py ),有一
    的头像 发表于 11-02 10:50 340次阅读

    Python 重载与重写的概念

    在上一次的推送 《Python 监控文件事件变化—以音乐高潮提取为例》 中,最后继承 LoggingEventHandler 类,对 on_created 进行修改的时候,我使用了一个词叫:重载
    的头像 发表于 11-03 15:13 593次阅读
    <b class='flag-5'>Python</b> <b class='flag-5'>重载</b>与重写的概念

    python如何导入模块

    。本文将详细介绍Python模块导入的相关知识,并举例演示常见的导入方式和用法。 首先,我们需要明确一些基本的概念。Python模块
    的头像 发表于 11-22 14:46 957次阅读

    Python智能家居系统代码介绍

    Python智能家居系统是一种基于Python编程语言开发的智能家居控制系统,在现代家庭中得到了越来越广泛的应用。本文将详细介绍Python智能家居系统的代码实现,包括系统的结构与功能
    的头像 发表于 01-25 09:46 1365次阅读

    开关量模块怎么控制中间继电器

    开关量模块控制中间继电器是一种常见的工业自动化控制方式。在这篇文章中,我们将介绍开关量模块的工作原理、中间继电器的工作原理以及如何使用开关量
    的头像 发表于 08-30 14:22 1034次阅读