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
# 后面代码略