Python动态加载模块

需求:实现一个简单的pyton程序,接收两个参数:plugin_name, data,根据不同的plugin_name定位到不同的逻辑处理模块并进行输出。
实现方案:
使用python的库函数:load_source,将插件模块加载到一个dict中key为模块名称,value为类的实例,核心代码:

def load_plugins():

    global plugin_dict

    # 遍历插件目录加载所有py结尾的模块

    for root, dirs, files in os.walk(module_path):

        for file in files:

            if file.endswith('.py'):

                module_name = file[:-3]

                print module_name

                module_file_path = os.path.join(root, file)

                module = load_source(module_name, module_file_path)

                # 判断插件中是否存在handler类

                if 'handler' in dir(module):

                    print 'load module: %s' % module_name

                    # 初始化类的实例并存入dict中,

                    clazz = getattr(module, class_name)

                    clazz_instance = clazz()

                    plugin_dict.update({module_name:clazz_instance})

 


插件代码样例:

# 统一的类

class handler:

    # 统一的处理接口

    def parse(self, data):

        print data

        result = []

        result.append(1)

        result.append(2)

        return json.dumps(result)

 


调用代码:

        # 根据plugin找到对应的实例

        clazz_instance = plugin_dict[plugin]

        try:

            ret = clazz_instance.parse(data_obj)

            return ret

        except Exception,e :

            print traceback.format_exc()

 


你可能感兴趣的:(python)