参考サイトでプラグイン管理モジュールを公開されているのをみて、
自分流にリメークしてみた。
違いは、シンプルにした点。
オリジナルは必須関数と推奨関数2つ登録できるのに対して、
リメークしたものは必須関数限定にしてある。
それと呼び出し用クラスを介してプラグインモジュールを呼び出せるようにした。
使い方はこんな感じ
[手順]
#プラグインローダを生成
pl = PluginLoader("./plugins")
#使いたいプラグインモジュール名を指定して関数を呼び出す。
func = pl.get_plugin_module("plugin_name")
func.get_name()
これでスレッド処理に対応させれば満足。
# -*- coding: utf-8 -*- import os import sys import inspect #targetDirパス内のプラグインファイルを読み込む class PluginLoader: def __init__(self, targetDir): self.plugFuncNames = ['run', 'test', 'get_name', 'get_ver'] self.pluginDict = {} sys.path.append(targetDir) # プラグイン検索&登録 for item in os.listdir(targetDir): modname = inspect.getmodulename(item) if modname not in self.pluginDict.keys(): self.import_plugin(modname) def import_plugin(self, modName): cnt = 0 funcDict = {} # プラグイン関数検索 funcList = inspect.getmembers(__import__(modName), inspect.isfunction) funcNames = [item[0] for item in funcList] for fname in self.plugFuncNames: if fname in funcNames: cnt = cnt + 1 # プラグイン関数登録 if cnt == len(self.plugFuncNames): for name, funcObj in funcList: if name in self.plugFuncNames: funcDict[name] = funcObj self.pluginDict[modName] = funcDict print "plugin registered:%s" % modName def get_plugin_count(self): return len(self.pluginDict) def get_plugin_list(self): return self.pluginDict.keys() def get_plugin_module(self, modName): return PluginFunc(self.pluginDict[modName]) #プラグインモジュールを呼び出すクラス class PluginFunc: def __init__(self, ptr): self.plugin_ptr = ptr def run(self): return self.plugin_ptr['run']() def test(self): return self.plugin_ptr['test']() def get_name(self): return self.plugin_ptr['get_name']() def get_ver(self): return self.plugin_ptr['get_ver']() #動作確認用 if __name__ == '__main__': pl = PluginLoader("./plugins") print 'plugin module count : %d' % pl.get_plugin_count() print '------------------------' for name in pl.get_plugin_list(): print "plugin name: " + name func = pl.get_plugin_module(name) print func.get_name() print func.get_ver() print func.run() print func.test() print '------------------------'
プラグインの雛形
# -*- coding: utf-8 -*- def run(): return "run" def get_name(): return "get_name" def get_ver(): return "get_version" def test(): return "test"
0 件のコメント:
コメントを投稿