当前位置: 首页 > news >正文

通过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

 

转载于:https://www.cnblogs.com/zoe233/p/8327997.html

相关文章:

  • 第二次C语言实验报告
  • ThinkPHP3.2 下载、导入Excel表格内容、导出内容到Excel表格功能的设计与实现
  • CORS跨域cookie传递
  • Python3 的元组
  • 【转】四款经典3.7v锂电池充电电路图详解
  • [TJOI2013]循环格
  • 6. python 字符串格式化表达式
  • tomcat 取消项目名访问路径
  • 【Python】学习笔记5-模块pymysql操作mysql数据库
  • mysql innodb myisam 比较
  • Git 安装配置
  • typeof面试题解答
  • 辩证看待 iostat
  • RpcContext
  • mysql学习笔记(1)--varChar和char类型的区别
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【RocksDB】TransactionDB源码分析
  • android 一些 utils
  • CentOS 7 防火墙操作
  • Create React App 使用
  • golang 发送GET和POST示例
  • Java 内存分配及垃圾回收机制初探
  • java8 Stream Pipelines 浅析
  • Java-详解HashMap
  • Linux gpio口使用方法
  • Linux下的乱码问题
  • Object.assign方法不能实现深复制
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • scrapy学习之路4(itemloder的使用)
  • 构建工具 - 收藏集 - 掘金
  • 技术发展面试
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊sentinel的DegradeSlot
  • 马上搞懂 GeoJSON
  • 数组大概知多少
  • 我这样减少了26.5M Java内存!
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 译自由幺半群
  • 优秀架构师必须掌握的架构思维
  • 《码出高效》学习笔记与书中错误记录
  • 2017年360最后一道编程题
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #QT(串口助手-界面)
  • $L^p$ 调和函数恒为零
  • (20)docke容器
  • (28)oracle数据迁移(容器)-部署包资源
  • (3)STL算法之搜索
  • (30)数组元素和与数字和的绝对差
  • (笔记自用)LeetCode:快乐数
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848