yapsyを使ってpythonのアプリケーションにpluginシステムを組み込む方法について
yapsy
yapsyはpluginシステムを組み込むためのライブラリ
A simple plugin system for Python applications
install
pip install yapsy
hello world
試しに以下の様なことをやってみる。
- 各pluginはrun()メソッドを持っているということにする
- HelloPluginというpluginを組み込む
- HelloPluginはrun()を呼び出した際に"hello"と出力
ファイル構成
ファイル構成は以下の通り。
. ├── main.py └── plugins ├── __init__.py ├── hello.py └── hello.yapsy-plugin 1 directory, 4 files
main.pyでpluginを読み込んで利用する。それ以外についての説明は後述する。
pluginの作成
pluginの作成には以下の2つの作業が必要
- plugin自体の実装
- info file(.yapsy-plugin)の作成
plugin自体の実装は単純でIPluginを継承したクラスを作れば良い。
# -*- coding:utf-8 -*- from yapsy.IPlugin import IPlugin class Hello(IPlugin): def run(self): print("hello")
IPlugin自体についても複雑なことはしていない。
self.is_activatedというインスタンス変数とそれをtoggleさせるactivate()
・deactivate()
というメソッドが用意されているだけ。
また、yapsyでは、pluginとして読み込まれるためには、infoファイルの作成が必要。 defaultでは、'.yapsy-plugin'という拡張子のファイルがinfoファイルとして認識される。 以下のようなフォーマットになっている。
[Core] Name = Hello Module = hello [Documentation] Author = John Smith Version = 0.1
Coreの部分だけ書いておけば読み出しには十分。
plugin loader側の作成
コードを読めば分かる程度のことではあるが、pluginloader側は以下の様にする。
- PluginManager.setPluginPlacesでpluginが格納されているディレクトリの位置を指定する
- PluginManager.getAllPluginsでpluginを取得する
# -*- coding:utf-8 -*- from yapsy.PluginManager import PluginManager import os def main(d): # Load the plugins from the plugin directory. manager = PluginManager() manager.setPluginPlaces([os.path.join(d, "plugins")]) manager.collectPlugins() # Loop round the plugins and print their names. for plugin in manager.getAllPlugins(): plugin.plugin_object.run() if __name__ == "__main__": main(os.path.dirname(__file__))
また、以下の様にpluginに対してcategoryなどの属性も付加出来る模様。
http://yapsy.sourceforge.net/index.html#more-sophisticated-plugin-classes