python动态加载包

来源:互联网 发布:ios11 数据开关 编辑:程序博客网 时间:2024/05/05 15:13
动态加载模块有三种方法
1,使用系统函数__import_()
stringmodule = __import__('string')

2,使用imp 模块
import imp

stringmodule = imp.load_module('string',*imp.find_module('string'))



imp.load_source("TYACMgrHandler_"+app.upper(), filepath)


3,使用exec
import_string = "import string as stringmodule"
exec import_string

变量是否存在
1,hasattr(Test,'t')
2, 'var'   in   locals().keys()
3,'var'   in   dir()

4,vars().has_key('s')



动态增加属性

class Obj(object):
    pass

def main():
 
    list=["a","b", "c"]

    for i inrange(1,len(list),2):
       Obj = type('Obj',(),{list[i]:lambdaself,s:obj.__setattr__(s.split(" = ")[0],s.split(" = ")[1])})
   
    obj =Obj()
    for i inrange(0,len(list),2):
       obj.__setattr__(list[i],list[i])   
       
   
    obj.a =1
    obj.b("a =2")
    obj.b("c =3")
    printobj.a
    printobj.c
   
    
if __name__ == '__main__':
    main()



动态载入包

def test(s,e):
    print s
    print e
   
class C():
    def __init__(self,name):
        print name
    def test(self):
        print 'class!!!'

加载器代码:

class Dynload():
    def __init__(self,package,imp_list):
        self.package=package
        self.imp=imp_list
       
    def getobject(self):
        return __import__(self.package,globals(),locals(),self.imp,-1)
    def getClassInstance(self,classstr,*args):
        return getattr(self.getobject(),classstr)(*args)   
    def execfunc(self,method,*args):
        return getattr(self.getobject(),method)(*args)
    def execMethod(self,instance,method,*args):
        return getattr(instance,method)(*args)

#Test:
dyn=Dynload('util.common',['*'])
ins=dyn.getClassInstance('C','gao')
dyn.execMethod(ins,'test')
dyn.execfunc('test','Hello','function!')


根据名字加载指定文件

def loadapp(self, app):
        filepath="mgr/"+app+".py"
        if os.path.exists(filepath):
            imp.load_source("TYACMgrHandler_"+app.upper(), filepath)

//修改了app.py,从新调用这个函数,新的代码自动生效



根据名字调用对应方法

return getattr(self, op)(args.get("port"), args) //op="start" args=dict

getattr(self, self.request.method.lower())(*args, **kwargs)