• 通过config文件配置动态导入模块


    需求:

      固定的服务中要调用不同的算法,当前服务中实现的动态导入是通过在config配置中加上参数:proto="AiProto(1,4)",在服务中from pathname import classname,然后通过a=eval(config.proto)的方式动态实例化。

      这里面有个问题,就是开发期间的服务可以通过添加from pathname01 import classname01的方式将所有可能用到的类导入,然后服务启动只需要更改配置即可。但是在后期,还会不断地导入新的模块,那么每次不仅需要修改config文件还需要在服务中添加from .. import ..的代码。

      那么如何实现仅需要修改config配置文件的动态导入呢?

    解决思路:

      在config文件中通过元组的形式将参数传入,如:

    proto = ('service.ai.ai_random','Ai_Random',7,1) # path,classname,arg1,arg2

    在服务中,可以通过config.proto切片获取相应的参数:

    pathname = config.proto[0]  # 'service.ai.ai_random'
    modulename = config.proto[1]   # 'Ai_Random'
    aid = config.proto[2]    # 7
    pid = config.proto[3]    # 1

      我们现在已经获取到了相应的参数,那么问题来了,我们怎么导入呢?

      一开始,我直接使用了下面的代码:

    from pathname import modulename

      显而易见,由于pathname和modulename都是字符串,肯定是不能成功的导入的。然后exec和eval都是执行字符串形式的指令的方法,并不能将字符串转换为变量。so,exec和eval也不可行。当前陷入了僵局,常常使用的简单方法已经不能满足我当前的需求。通过stackoverflow我发现了__import__方法,但是绝大多数都是实现了最简单的__import__('modulename')这样的动态导入,而不是我想要的这种。随机找了关于__import__各类资料,其中比较好理解且有助于学习的有:

      http://blog.csdn.net/xlisper/article/details/28722745

      http://python.jobbole.com/87492/

      https://www.cnblogs.com/xiaoyaowuming/p/5633207.html

      https://stackoverflow.com/questions/301134/dynamic-module-import-in-python

    通过上面的这些资料,找到对应我应该使用的是:

      from pkg.module1 import submodule1

    module1 = __import__('pkg.module1', fromlist=['submodule1'])  
    module1.submodule1  
    #当fromlist不为空时,__import__方法会返回name参数中最右面的模块对象,此处是module1。 
    

      参考上述示例我的代码就应该是:

      p = __import__(pathname,fromlist=[modulename,])

    然后用p.modulename去调用类,发现我成功地导入了模块,但是不能加载类,怎么办呢?看到getattr方法,我们来轻松解决:

    try:
        p = __import__(pathname,fromlist=[modulename,])
        Proto = getattr(p,modulename)
    except:
        pass
  • 相关阅读:
    Yii中缓存依赖的处理
    简单实现Tab切换(带框架)
    Server Application Unavailable出现的原因及解决方案集锦
    Microsoft.ReportViewer.WebForms, Version=10.0.0.0的报错问题,解决方案
    ASP.NET中树型DropDownList的绑定
    VS2010 使用时选择代码或双击时出错,点击窗口按钮后VS自动重启问题
    js实现文本框限制输入数字和小数点--兼容多个浏览器
    输入的全角字符转换成半角字符--css、js、ASP.NET
    sql把表格拼成字符串,多半使用于GROUP BY
    Sql将逗号分隔的字符串分拆成表格的方法
  • 原文地址:https://www.cnblogs.com/zoe233/p/8327997.html
Copyright © 2020-2023  润新知