根据不同形式的module_path来对模块进行加载

import importlib.util 
# 导入模块

module_path1 = "my_module.py" 
# 模块1的路径

module_path2 = "/home/user/my_module.py" 
# 模块2的路径

module_path3 = "package.subpackage.my_module.py" 
# 模块3的路径

def load_module(module_path):
    # 根据路径加载模块
    module_name = module_path.split("/")[-1].replace(".py", "") 
    # 取出模块名,去掉后缀".py"
    
    if "/" in module_path:
        #  如果路径中含有"/",说明是在一个包内部,需要重新定义spec以便添加包路径
        package_path = "/".join(module_path.split("/")[:-1])
        spec = importlib.util.spec_from_file_location(module_name, module_path, submodule_search_locations=[package_path])
    else:
        #  如果路径不含本符号,说明是直接加载单一模块
        spec = importlib.util.spec_from_file_location(module_name, module_path)
    
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    # 运行模块
    
    return module 

# 分别加载三个模块
my_module1 = load_module(module_path1) 
my_module2 = load_module(module_path2) 
my_module3 = load_module(module_path3) 

修改版:

import importlib
import sys

def load_module(module_path):
    """
    根据不同形式的module_path来对模块进行加载

    参数:
    module_path -- 字符串类型,模块的路径,可以是 "模块名"、"模块名.模块名"、"模块名.py" 或者 "模块名/模块名.py" 中的任意一种形式

    返回值:
    加载成功则返回对应的模块对象,否则返回 None
    """

    # 如果 module_path 以 ".py" 结尾,则去掉 ".py" 后缀
    if module_path.endswith(".py"):
        module_path = module_path[:-3]

    # 如果 module_path 中包含 "/",则将 "/" 替换为 "."
    module_name = module_path.replace("/", ".")

    try:
        # 根据 module_name 直接导入模块
        return importlib.import_module(module_name)
    except ImportError:
        pass

    try:
        # 如果 module_name 无法直接导入,则尝试从 sys.path 中查找 module_path 对应的模块
        module_spec = importlib.util.find_spec(module_path)

        if module_spec is None:
            return None

        # 使用 module_spec.loader 加载模块并返回模块对象
        module = importlib.util.module_from_spec(module_spec)
        module_spec.loader.exec_module(module)
        return module
    except ImportError:
        pass

    return None

if __name__ == "__main__":
    # 加载模块,使用 ".py"、"/"、"."、"模块名"、"模块名.模块名" 等形式均可
    module = load_module("test_module")
    if module is not None:
        # 执行模块中的测试函数
        module.test_function()

运行示例:

假设要加载的模块结构如下:
test_module/
    __init__.py
    test_submodule.py
    util.py

假设 util.py 中定义了一个辅助函数 helper(),test_submodule.py 中定义了一个测试函数 test_function()

执行以下命令即可执行 test_submodule.py 中的 test_function() 函数:

python load_module.py test_module/test_submodule.py
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值