ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python系列 52 内置模块:importlib

2021-07-04 14:05:13  阅读:219  来源: 互联网

标签:importlib Python middleware py 中间件 52 模块 main


importlib简介

importlib模块作为Python内置模块,提供了更多导入模块的方式。

官方文档

常用方法:

  • importlib.import_module(str):根据字符串导入1个模块,该字符串以.为路径分割,如"package.module"

项目示例

假设我的项目之中包含了多个中间件,并且这些中间件会在项目正式启动之前先行启动。

我该如何集中式的管理这些中间件,让它们在需要的时候能够快速加上,不需要的时候能够快速去除呢?

使用importlib模块是最明智的选择,整个项目目录如下:

PYTHONPROJECT
│
├─bin
│  |  run.py
│
├─middleware
│  │  first_middle.py
│  │  init.py
│  │  second_middle.py
│  │  __init__.py
│
├─view
│   │  main.py
│  
│  settings.py

首先先查看一下run.py,它主要处理项目模块路径、中间件初始化以及主程序的运行:

# run.py

import os
import sys

BASE_DIR =  os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)

from middleware.init import init
from view.main import main

if __name__ == "__main__":
    # init middleware
    init()
    # run main
    main()

再来看一下中间件的启动,它会从配置文件中拿到被集中化管理的需要启动的中间件,然后利用importlib模块对其进行导入后执行其下的某一个方法:

# middleware/init.py

import importlib
import settings

def init():
    for stringPath in settings.LOAD_MIDDLEWARE:
        modulePath, funcName = stringPath.rsplit(".", maxsplit=1)
        # 利用importlib模块根据字符串路径导入模块
        module = importlib.import_module(modulePath)
        # 模块也是对象,所以利用反射拿到函数对象并执行
        funcObject = getattr(module, funcName)
        funcObject()

被集中管理的需要加载的中间件被定义在了settings.py的1个列表中。

其中每条数据项代表1个需要被加载的中间件,以BASE_DIR为准,用.进行分割,确定了中间件的导入路径与运行函数:

# settings.py

LOAD_MIDDLEWARE = [
    "middleware.first_middle.m1",
    "middleware.second_middle.m2"
]

当后续需要新增中间件,只需要在middleware包中添加好.py文件并且在settings.py中按照格式把路径和运行函数填入即可。

如果要取消某个中间件的加载,直接在列表中对它进行注释即可。

总结2点:

  • 如何规定模块导入的格式,参见LOAD_MIDDLEWARE列表
  • 如何使用importlib快速导入模块且执行模块下的某一个函数,参见init.py文件

把其他代码也补上吧,中间件的启动函数:

# middleware/first_middle.py
def m1():
    print("middleware 1 run..")
    
# middleware/second_middle.py
def m2():
    print("middleware 2 run..")

主程序函数:

# view/main.py

def main():
    print("view main run...")

运行结果:

middleware 1 run..
middleware 2 run..
view main run...

标签:importlib,Python,middleware,py,中间件,52,模块,main
来源: https://blog.csdn.net/weixin_43422005/article/details/118461664

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有