通过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 ...
随机推荐
- 人工智能新手入门学习路线和学习资源合集(含AI综述/python/机器学习/深度学习/tensorflow)
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] 1. 分享个人对于人工智能领域的算法综述:如果你想开始学习算法,不妨先了解人工 ...
- Java通过Http请求服务器
Java通过Http请求服务器图片输出.下载.转换 Java开发过程中总会遇到从服务器中请求文件(图片.text文档等).此处详情记录从服务器下载图片的方法,以及以多种方式输出. 1.整体流程: 建立 ...
- docker-compose错误
1.错误信息: ERROR: for gamehall Get https://hub.tondeen.com/v1/_ping: http: server gave HTTP response to ...
- 计算机网络协议,UDP数据报的分析
一.UDP数据报的特点 1.基本特性 UDP是在IP数据报的基础上增加了复用和分用以及差错检测的功能 UDP的主要特点如下: UDP是无连接的:即发送数据之前不需要建立连接 UDP使用尽最大努力交付, ...
- 安卓开发学习日记 DAY1
1.eclipse安装,很简单 2.安卓sdk manager 下载安装 sdk manager是一个安卓开发所使用的sdk文件的管理程序,可以使用这个程序在官网上下载相应的安卓的api等.因为需要在 ...
- vue实现首屏加载等待动画 避免首次加载白屏尴尬
0 直接上效果图 1背景,用户体验良好一直是个重要的问题. 2怎么加到自己项目里面? 复制css html代码到自己的index.html即可 代码链接 源码地址 Vue学习前端群493671066, ...
- MODIS系列之NDVI(MOD13Q1)二:modis数据相关信息
1.MODIS数据的特点 (1)全球免费:NASA对MODIS数据实行全球免费接收的政策(TERRA卫星除MODIS外的其他传感器获取的数据均采取公开有偿接收和有偿使用的政策),这样的数据接收和使用政 ...
- GitHub搭建个人主页
GitHub搭建个人主页 1.注册登录GitHub 2.新建仓库 新建一个名为"username.github.io",其中username为你的用户名,仓库必须为公有类型,私有仓 ...
- MYSQ创建联合索引,字段的先后顺序,对查询的影响分析
MYSQ创建联合索引,字段的先后顺序,对查询的影响分析 前言 最左匹配原则 为什么会有最左前缀呢? 联合索引的存储结构 联合索引字段的先后顺序 b+树可以存储的数据条数 总结 参考 MYSQ创建联合索 ...
- editplus 怎么替换为换行
到editplus 的搜索 菜单中,选择替换,记住 这边如果是简单的一些 通用字符 替换可以直接替换,如果是一些特殊的字符 那必须选择 替换框左下中间的 “正则表达式”,即把这个“正则表达式” 前边的 ...