python动态导入模块

目的是为了实现从配置文件切换运行时应该应用的模块,用C#的时候其实挺复杂的,因为是静态语言,所以要动态切换那就只有用反射了,python就容易多了,只要在运行的代码前动态import一下,就可以达到目的了

假设有一个包“mypackage”,里面有三个module:md01.py, md02.py和md03.py,里面实现的是同一个方法

def getstr():
    return "from md01/2/3"

其中123因moudle不同而不同

那么我们怎么用?

from xml.dom import minidom


if __name__=="__main__":
    #假定一个xml配置文件,读取moudle节点
    xml='''<?xml version="1.0"?><root><moudle>md03</moudle></root>'''
    p=minidom.parseString(xml)
    mdname=p.getElementsByTagName("moudle")[0].firstChild.data
    mymod=__import__("mypackage."+mdname,fromlist=["*"])#fromlist很重要
    print mymod.getstr()

测试过程中,唯一忽略的就是__import__里面的fromlist参数,结果怎么也得不到模块,只能得到包,原因就是要在fromlist里面把可能参与导入的模块名要写进去,

这是一个很赞的设计,假如你这个包非常庞大,但你只需要几个模块参与,你就把那几个模块名写进去就可以了

假如导入的是自己的包里的模块,那么fromlist为空或者送该参数即可

posted @ 2011-07-27 20:52  $walker  阅读(3970)  评论(0编辑  收藏  举报