yapsyを使ってpythonのアプリケーションにpluginシステムを組み込む方法について

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