• python之模块动态加载


    Python之模块动态加载

    1.__import__

    项目里很经常见到这样的场景,根据环境变量,加载不同的配置。

    测试环境:config_dev.py

    db_host = '127.0.0.1'
    
    • 1

    正式环境:config_pro.py

    db_host = '192.168.0.1'
    
    • 1

    这种情况就可以用__import__来动态加载,简单示例如:

    project_env = 'dev'
    
    if project_env == 'dev':
        config = __import__("config_dev")
    else:
        config = __import__("config_pro")
    
    print(config.db_host)
    
    # 结果:
    # 127.0.0.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.fromlist

    __import__有很多参数,其中name 是必须的,其它参数中fromlist是一个比较重要的参数。在上一个示例中,两份配置与引入模块的文件是在同一个文件夹下,那不在呢?现在,更改项目结果 :

    ├── conf
    │   ├── __init__.py
    │   ├── config_dev.py
    │   └── config_pro.py
    └── demo.py
    
    • 1
    • 2
    • 3
    • 4
    • 5

    改一下demo.py的代码:

    project_env = 'dev'
    
    if project_env == 'dev':
        config = __import__("conf.config_dev")
    else:
        config = __import__("conf.config_pro")
    
    print(config)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出结果:

    <module 'conf' from 'D:\\project\\python\\black_api\\demo\\conf\\__init__.py'>

    看出来了吗?我们的本意是想导入不同的模块,config_devconfig_pro,但实际导入的是conf模块,与我们预期不符。这种情况下,需要使用fromlist参数:

    project_env = 'pro'
    if project_env == 'dev':
         config = __import__("conf.config_dev", fromlist="config_dev")
    else:
         config = __import__("conf.config_pro", fromlist="config_pro")
    print(config)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    <module 'conf.config_pro' from 'D:\\project\\python\\black_api\\demo\\conf\\config_pro.py'>

    结论:在使用__import__函数时,name的地址如果包含了包的名字, 一定要使用fromlist参数来指明要导入包里的哪个模块,否则会将整个包导入。

    3.importlib.import_module

    importlib模块的import_module方法相比于__import__更加友好,使用起来更加方便。还是以示例2的项目结构,修改demo.py的代码:

    import importlib
    
    project_env = 'dev'
    if project_env == 'dev':
        # 绝对导入
        config = importlib.import_module('conf.config_dev')
    else:
        # 相对导入
        config = importlib.import_module('.config_pro', package='conf')
    print(config.db_host)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用相对导入时,务必在name前面加一个点

  • 相关阅读:
    layUI项目之(待开会议&历史会议&所有会议)
    【杂七杂八】Windows和Linux怎么配置环境变量
    BLE Mesh蓝牙mesh传输大数据包传输文件照片等大数据量通讯
    c++ 单源最短路径-狄杰斯特拉算法
    java学习day7(Java基础)方法和封装
    pyG教程
    postman+Newman+Jenkins搭建详细流程
    几种经典的卷积神经网络
    Debain 11 LINUX 操作系统技巧
    自然语言处理(NLP)—— 语言学、结构的主要任务
  • 原文地址:https://blog.csdn.net/qsloony/article/details/125559918