通过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
通过config文件配置动态导入模块的更多相关文章
- 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块
1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...
- Python 动态导入模块
动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │ └── aa.py ├── test1.py lib目录下 ...
- Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- python_111_动态导入模块
lib下aa.py文件内容: class C: def __init__(self): self.name='alex' from lib import aa#正常导入 print(aa.C) 动态导 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 进击的Python【第八章】:动态导入模块、断言、socket开发之SSH,FTP
一.动态导入模块 知道一个模块名的字符串形式,通过字符串来导入模块 mod = __import__("lib.aa") print(mod) instance = getattr ...
- python动态导入模块——importlib
当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...
- python_反射:动态导入模块
官方推荐方法: test_mod.py def hi(): print('Hi') test.py import importlib q = importlib.import_module('test ...
随机推荐
- 新手必学linux文本文件编辑命令 vi vim.....
作为一名Linux新手小白,今天就和大家简单地了解一下Linux的Vim文本编辑器的使用. Vim文本编辑器 vim编辑器的三大模式——命令模式.编辑模式和末行模式 命令 ...
- MYSQL索引类型。MYSQLc储存引擎
MYSQL索引类型,MYSQLc储存引擎 MySQL索引创建与删除 MySQL存储引擎的 ...
- 字符串截取及切割,正则表达式,expect预期交互
字符串截取及切割,正则表达式,expect预期交互 案例1:字符串截取及切割 案例2:字符串初值的处理 案例3:expe ...
- kepp running 团队视频分析初步总结
一.遇码则码队视频讨论: 时 间:2020.03.31 方 式:视频会议 参加人员:温学智,胡海靖,莫佳亮 二.视频讨论会议截图: 三.纪要内容: (1).主要功能和界面显示: 温学智:在 ...
- java中的动手动脑
1.关于构造函数的问题 为什么上面的代码不能通过编译? 因为当你没有定义构造函数时,java编译器在编译时会自动生成一个无参的构造函数,上面的代码就可以进行执行了.但是当你顶一个构造函数时,编译器将不 ...
- MTK Android中设置默认时区
设置默认时区 PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai\ 注:搜索“persist.sys.timezone ...
- javascript 入门 之select2功能大全
1.代码较为简单,不作太多讲解,新建一个javascript工程,在index.htl中编写如下代码,根据<link>和<script>标签配制好js和css库便可! < ...
- web自动化测试中的PO模式(一)
1.PO模式的思想 原理: 将页面的元素定位和元素行为封装成一个page类 类的属性:元素的定位 类的行为:元素的操作 页面对象和测试用例分离 测试用例: 调用所需要页面对象中的行为,组成测试用例 测 ...
- pgsql中的lateral使用小结
pgsql中的lateral 什么是LATERAL 带有LATERAL的SQL的计算步骤 LATERAL在OUTER JOIN中的使用限制(或定义限制) LATERAL的几个简单的例子 总结 举几个我 ...
- 数据结构和算法(Golang实现)(16)常见数据结构-字典
字典 我们翻阅书籍时,很多时候都要查找目录,然后定位到我们要的页数,比如我们查找某个英文单词时,会从英语字典里查看单词表目录,然后定位到词的那一页. 计算机中,也有这种需求. 一.字典 字典是存储键值 ...