相关文章推荐
欢快的香烟  ·  将Mathematica生成的不规则形状数组 ...·  3 月前    · 
烦恼的水桶  ·  python用符号拼接DataFrame两列 ...·  3 月前    · 
斯文的杯子  ·  Python+Django 核心介绍 - ...·  3 月前    · 
愤怒的风衣  ·  Python 异步 ASGI ...·  3 月前    · 
奔跑的骆驼  ·  结合使用 Oracle Database ...·  3 月前    · 
有腹肌的黄花菜  ·  番紅花與紅花·  1 年前    · 
没读研的油条  ·  游戏IP与文旅加速融合 ...·  1 年前    · 
有情有义的铁板烧  ·  浙江省温州市各类事业单位统一登记管理试点取得 ...·  1 年前    · 
睡不着的针织衫  ·  首批射频美容仪“持证”,觅光、玛丽仙获三类医 ...·  1 年前    · 
千杯不醉的海龟  ·  Xgspon支持的分光 - CSDN文库·  2 年前    · 
Code  ›  python笔记73-动态导入模块import_module 和 重载reload开发者社区
方法重载 python函数 重载函数 python
https://cloud.tencent.com/developer/article/1971551
善良的牛肉面
3 年前
作者头像
上海-悠悠
0 篇文章

python笔记73-动态导入模块import_module 和 重载reload

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 从零开始学自动化测试 > python笔记73-动态导入模块import_module 和 重载reload

python笔记73-动态导入模块import_module 和 重载reload

作者头像
上海-悠悠
发布 于 2022-04-02 13:15:08
852 0
发布 于 2022-04-02 13:15:08
举报

前言

python动态加载import_module 和 重载reload 的使用 python环境:V3.6.x

import_module

当我们在运行一段程序,根据需要动态加载一个模块,调用里面的方法时,除了平台使用的import module,也可以在代码里面用到import_module方法。 比如我有个模块 yoyo.py,里面写了个函数

def fun1():
    return "hello world"
def fun2():
    return "上海-悠悠"

a.py 需要加载yoyo.py模块(2个文件在同一层级)

import importlib
import inspect
# 动态导入模块
m = importlib.import_module('yoyo')
print(m)  # module object
# 调用fun1
print(m.fun1())  # hello world
# 获取模块全部函数
items = inspect.getmembers(m, inspect.isfunction)
print(dict(items))
# {'fun1': <function fun1 at 0x0000015CEAEA0DC0>, 'fun2': <function fun2 at 0x0000015CEAEEA670>}

运行结果:

<module 'yoyo' from 'D:\\demo\\demo\\yoyo.py'>
hello world
{'fun1': <function fun1 at 0x0000015CEAEA0DC0>, 'fun2': <function fun2 at 0x0000015CEAEEA670>}

动态更新模块

前面 importlib.import_module() 导入模块是没有问题的,但是如果在执行的过程中 yoyo.py 模块发生了改变,会无法加载到最新的方法。 可以在python交互环境测试次问题

D:\demo\demo>python
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import importlib
>>> m = importlib.import_module('yoyo')
<module 'yoyo' from 'D:\\demo\\demo\\yoyo.py'>
>>> m.fun1()
'hello world'
>>> m.fun2()
'上海-悠悠'
>>>

当我在yoyo.py模块新增一个fun3()函数时,yoyo.py内容如下

def fun1():
    return "hello world"
def fun2():
    return "上海-悠悠"
def fun3():
    return "hello yoyo"

此时继续在上面交互环境操作,调用fun3()方法

>>> m.fun3()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'yoyo' has no attribute 'fun3'
>>>

于是会看到新增的函数是无法调用的,因为在前面已经导入了模块,模块里面的2个函数,已经被加载进去了,后面模块更新的内容是不会自动更新的。 那么有没什么办法,可以在新增方法后,重新让系统加载一次模块呢?这里可以用到reload() 方法,重载模块

reload() 重载模块

接着刚才的报错,使用reload()重载模块

>>> from importlib import reload
>>> new = reload('yoyo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\python36\lib\importlib\__init__.py", line 139, in reload
    raise TypeError("reload() argument must be a module")
TypeError: reload() argument must be a module
>>>

直接写模块名称会出现报错:reload() argument must be a module

看下reload()的相关源码说明:传的module参数必须在使用之前被成功导入过。

def reload(module):
    """Reload the module and return it.
    The module must have been successfully imported before.
    if not module or not isinstance(module, types.ModuleType):
        raise TypeError("reload() argument must be a module")
        name = module.__spec__.name
    except AttributeError:
        name = module.__name__

module参数可以通过sys模块获取到模块对象 sys.modules['yoyo']

>>> import sys
>>> sys.modules['yoyo']
<module 'yoyo' from 'D:\\demo\\demo\\yoyo.py'>
>>> new = importlib.reload(sys.modules['yoyo'])
>>> new.fun3()
'hello yoyo'
>>> new.fun1()
'hello world'
>>> new.fun2()
'上海-悠悠'

于是就可以成功调用到新增的fun3()方法

更新方法和删除方法

如果更新了方法里面代码,fun3()改成返回”123456”

def fun3():
 
推荐文章
欢快的香烟  ·  将Mathematica生成的不规则形状数组导入Python的技术问询
3 月前
烦恼的水桶  ·  python用符号拼接DataFrame两列开发者社区
3 月前
斯文的杯子  ·  Python+Django 核心介绍 - 实践 - clnchanpin
3 月前
愤怒的风衣  ·  Python 异步 ASGI 服务器及框架开发者社区
3 月前
奔跑的骆驼  ·  结合使用 Oracle Database 11g 和 Python
3 月前
有腹肌的黄花菜  ·  番紅花與紅花
1 年前
没读研的油条  ·  游戏IP与文旅加速融合 点燃消费新活力--经济・科技--人民网
1 年前
有情有义的铁板烧  ·  浙江省温州市各类事业单位统一登记管理试点取得实效-事业单位登记管理-中国机构编制网
1 年前
睡不着的针织衫  ·  首批射频美容仪“持证”,觅光、玛丽仙获三类医疗器械注册证
1 年前
千杯不醉的海龟  ·  Xgspon支持的分光 - CSDN文库
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号