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

# 后面代码略

 

posted @ 2019-06-10 08:13  hahsuu  阅读(2156)  评论(0编辑  收藏  举报