python importlib使用

# __import__是import语句的底层实现,解释器用的,是Python早期用于动态导入模块的函数,
# 而importlib模块是在Python 3中引入的,提供了更丰富的API来处理模块导入相关的操作。

import importlib
from importlib import util


def import_source_1(import_module_name):
    """
    官方推荐使用importlib.import_module("module_name")来导入模块
    :param import_module_name:
    :return:
    """
    # 1. 引入同目录下的模块
    # 如果模块不存在,会报错,可以提前判断是否存在该模块,此方式仅可引入与当前文件同级的其他package
    module_spec = importlib.util.find_spec(import_module_name)
    # 如果返回None,说明没有找到该模块
    if module_spec:
        module = importlib.import_module(import_module_name)
        print(module)
        # 先获取是否存在属性或方法
        print(hasattr(module, "test_03"))

        func = module.test_method_outer
        print(func)
        cls = module.TestClass
        print(cls)

        # 拿到类对象后,可以实例化
        obj = cls()
        print(cls.value_test)
        print(obj.value_test)
    else:
        print("导入的模块不存在:" + import_module_name)


def import_source_2(module_name, module_file_path):
    """
    官方推荐使用importlib.import_module("module_name")来导入模块
    :param module_name:
    :param module_file_path:
    :return:
    """
    # 1. 引指定路径下的模块
    # 如果模块不存在,会报错,可以提前判断是否存在该模块,此方式仅可引入与当前文件同级的其他package
    # 创建模块规范
    module_spec = importlib.util.spec_from_file_location(module_name, module_file_path)
    # 根据规范创建模块
    module = importlib.util.module_from_spec(module_spec)
    # 执行模块
    module_spec.loader.exec_module(module)
    # 从执行的模块中找到想要执行的函数
    func = module.test_03
    func("test1", "test2")

    # 从执行模块中找到想要执行的类
    cls = module.Test01
    # 示例化类
    cls = cls()
    # 执行类函数
    cls.test_01()


def import_source_3(module_name, module_file_path):
    """
    官方推荐使用importlib.import_module("module_name")来导入模块
    :param module_name:
    :param module_file_path:
    :return:
    """
    # 1. 引指定路径下的模块
    # 如果模块不存在,会报错,可以提前判断是否存在该模块,此方式仅可引入与当前文件同级的其他package
    # 创建模块规范
    module_spec = importlib.util.spec_from_file_location(module_name, module_file_path)
    # 根据规范创建模块
    module = importlib.util.module_from_spec(module_spec)
    module_spec.loader.exec_module(module)
    # 使用getatter从执行的模块中找到想要执行的函数
    func = getattr(module, "test_03")
    func("test1", "test2")

    # 使用getatter从执行的模块中找到想要执行的类
    cls = getattr(module, "Test01")
    # 实例化类
    cls = cls()
    # 执行类函数
    cls.test_01()


if __name__ == '__main__':
    import_source_3("test_demo", r"D:\MyCode\vue-learn\AjTmp\backend\AutoTestMain\PyCase\test_demo.py")

参考内容
【python中的类反射】https://blog.csdn.net/weixin_39743356/article/details/137086164
【python中的importlib模块】https://cloud.tencent.com/developer/article/1496629

posted @   PyAj  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示