pythonではモジュール・ライブラィファイル [lib].py
をimport文により取り込み、[lib].py
にある関数、クラス、変数を再利用することができます。
しかしながら、別のモジュールファイルに差し替える場合、ソースファイルの書き換えが必要になります。
また、標準ライブラィパス、PYTHONPATHで指定したパス以外からのモジュールをimportできません。
importlib という標準パッケージを利用することにより、モジュールファイルパスを文字列型で与え、pythonプログラムを実行した後に動的にimportすることが可能になります。
標準・共通機能 (関数、クラス、変数) [API: Application-Program Interface] を組み込んだモジュールを特定のフォルダーに入れ、動的インポートと組み合わせることで、plug-in 型プログラムを作成できます。
注: ライブラリィパスを追加する方法として、sys.path.append() や.pth ファイルを使う方法があります。しかしながら、これらの方法を使うと、異なるディレクトリィ構成に対応できませんし、意図しないパスからライブラリィを読み込む危険性があります。
importlibで動的インポートする際、モジュールでエラーが起こっても、「モジュールが見つからない」メッセージしか表示されないため、エラー個所の特定ができません。
そのため、動的ロードするモジュールは、単独でテスト実行できるようにしておく必要があります。
モジュールを単独で実行する場合だけ特定の関数を呼び出すには、__name__
変数を利用します。
モジュールプログラムから実行した場合は __name__ に
"__main__" が入りますが、他のプログラムから import
された場合は、そのモジュール名が入ります。
そのため、以下の構文により、モジュールが単独で実行された時だけ
main() 関数を呼び出すことができます。
モジュールの場合、main()
関数にモジュール関数・クラスのテストプログラムを書いておくと便利です。
void main():
...
if __name__ == "__main__":
main()
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)