zoukankan      html  css  js  c++  java
  • python动态导入包

    在廖雪峰老师的python教程实战中的编写web框架一节中,见(https://www.liaoxuefeng.com/wiki/1016959663602400/1018490695712544),其中有一个函数add_routes,代码如下:

    def add_routes(app, module_name):
        n = module_name.rfind('.')
        if n == (-1):
            mod = __import__(module_name, globals(), locals())
        else:
            name = module_name[n+1:]
            mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name)
        for attr in dir(mod):
            if attr.startswith('_'):
                continue
            fn = getattr(mod, attr)
            if callable(fn):
                method = getattr(fn, '__method__', None)
                path = getattr(fn, '__route__', None)
                if method and path:
                    add_route(app, fn)

    在廖雪峰老师代码的基础上,我作了一些修改。

    使用相对简单的 import_module方法来动态导入视图函数(控制器)的包,而后使用 walk_packages方法来递归动态导入上述包中的所有模块。

    import importlib
    import pkgutil
    
    
    base = importlib.import_module('app.controller')
    
    for loader, module_name, is_pkg in  pkgutil.walk_packages(base.__path__, f'{base.__name__}.'):
    
        try:
            sub_module = __import__(module_name, fromlist=['get_submodule'])
        except ImportError as e:
            raise e

    # 后面代码略
  • 相关阅读:
    利用shell脚本实现免密认证
    利用shell脚本实现https证书认证
    高级sed命令
    Zabbix自定义监控
    Zabbix三种邮箱告警配置
    Zabbix配置
    监控服务Zabbix部署
    Ftp
    Samba
    NFS
  • 原文地址:https://www.cnblogs.com/panchong/p/10995770.html
Copyright © 2011-2022 走看看