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

# 后面代碼略

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM