zoukankan      html  css  js  c++  java
  • python动态导入模块——importlib

    当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入

    这种时候就需要用上python的动态导入模块

    比如此时文件结构为:

    ├── models
    │   ├── __init__.py
    │   ├── cycle_gan_model.py
    │   └── pix2pix_model.py
    └── train.py

    假设此时参数的设置中有:

    import argparse
    
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--model', type=str, default='cycle_gan', help='chooses which model to use. [cycle_gan | pix2pix | test | colorization]')
    args = parser.parse_args()

    此时如果想要根据传入的参数args.model的值决定导入哪个模块,则:

    import importlib
    model_filename = "models." + args.model + "_model"
    # 根据指定的args.model来导入本地models文件夹中的相应args.model + '_model.py'模块
    # 假设如果args.model = cycle_gan,则导入模块models.cycle_gan_model
    modellib = importlib.import_module(model_filename)

    然后就能够使用modellib来调用cycle_gan_model模块

    等价于:

    frommodels import cycle_gan_model as modellib


    总结来说:倒入包的‘路径’是拼接出来的。类似于路径拼接一个道理。

    在wapiti中的应用代码实例:

    for mod_name in attack.modules:
    mod = import_module("wapitiCore.attack." + mod_name)
    mod_instance = getattr(mod, mod_name)(self.crawler, self.persister, logger, self.attack_options) # 出发一个个攻击模块,建立一个个对象
    if hasattr(mod_instance, "set_timeout"):
    mod_instance.set_timeout(self.crawler.timeout)
    self.attacks.append(mod_instance)

    self.attacks.sort(key=attrgetter("PRIORITY"))
  • 相关阅读:
    C#与Java的几点区别
    用VB读取记事本的内容,控制计算器的按钮(VB6)
    通过实例说明Java中的多态
    [导入]析构函数(内存泄漏,三法则)
    [导入]const限制符
    [导入]类的一些特殊限制成员
    [导入]基类的复制控制函数
    [导入]容器适配器
    [导入]派生类到基类转换的可访问性
    [导入](复制、默认)构造函数
  • 原文地址:https://www.cnblogs.com/kevin-red-heart/p/13576988.html
Copyright © 2011-2022 走看看