トップページに戻る

pythonによるplug-inプログラミング

 pythonではモジュール・ライブラィファイル [lib].py をimport文により取り込み、[lib].py にある関数、クラス、変数を再利用することができます。
しかしながら、別のモジュールファイルに差し替える場合、ソースファイルの書き換えが必要になります。
また、標準ライブラィパス、PYTHONPATHで指定したパス以外からのモジュールをimportできません。

 importlib という標準パッケージを利用することにより、モジュールファイルパスを文字列型で与え、pythonプログラムを実行した後に動的にimportすることが可能になります。

 標準・共通機能 (関数、クラス、変数) [API: Application-Program Interface] を組み込んだモジュールを特定のフォルダーに入れ、動的インポートと組み合わせることで、plug-in 型プログラムを作成できます。

注: ライブラリィパスを追加する方法として、sys.path.append() や.pth ファイルを使う方法があります。しかしながら、これらの方法を使うと、異なるディレクトリィ構成に対応できませんし、意図しないパスからライブラリィを読み込む危険性があります。


plug-inプログラミングの注意点

 importlibで動的インポートする際、モジュールでエラーが起こっても、「モジュールが見つからない」メッセージしか表示されないため、エラー個所の特定ができません。

 そのため、動的ロードするモジュールは、単独でテスト実行できるようにしておく必要があります。

 モジュールを単独で実行する場合だけ特定の関数を呼び出すには、__name__ 変数を利用します。
モジュールプログラムから実行した場合は __name__ に "__main__" が入りますが、他のプログラムから import された場合は、そのモジュール名が入ります。
そのため、以下の構文により、モジュールが単独で実行された時だけ main() 関数を呼び出すことができます。 
モジュールの場合、main() 関数にモジュール関数・クラスのテストプログラムを書いておくと便利です。

void main():
  ...

if __name__ == "__main__":
   main()


tklibにおけるpluginの利用

 tklibでは、tkApplicationクラスにpluginを利用する関数が用意されています。

from tklib.tkapplication import tkApplication

app = tkApplication()
cparams = app.get_params()

load_moduleでモジュールオブジェクトを受け取る場合:

# module_name: "test"の場合、test.pyをロードします
# desc: モジュールの説明
# ret_type: 'module' にすると、ロードしたモジュールオブジェクトが返されます
module = app.load_module(module_name = "test", desc = "test module", ret_type = 'module')

# ロードしたmoduleのread_data()関数を呼び出し、戻り値を受け取ります
inf = module.read_data(path, app = app, cparams = cparams)

load_moduleでモジュール名を受け取る場合:

# module_name: "test"の場合、test.pyをロードします
# desc: モジュールの説明
# ret_type: 指定しない場合、あるいは 'str' にすると、ロードしたモジュールのモジュール名が返されます (module_nameと同じ)
module = app.load_module(module_name = "test", desc = "test module")

# ロードしたmoduleのread_data()関数を呼び出し、戻り値を受け取ります
inf = app.call(module, "read_data", path, app = app, cparams = cparams)