Pythonで動的にファイルを読込、プラグインを実現してみる

python Python

この記事の内容

この記事では、Pythonで動的に追加されたpyファイルを読み込み、実行する方法を紹介します。

この方法を用いることで、プラグインの機能を実装することができます。

具体的には、ベースのPythonファイルは変更等が不要で、ファイルを追加するだけで機能を追加するような機構を作ることができます。

実行サンプル

今回は、ファイルを追加することで動的に計算方法が追加できるといった例でサンプルを作成します。

具体的には以下のようなプログラムです。

以下は足し算を行うケースで、計算方法と計算に使う値を指定すると、計算結果(足し算)を表示します。

以下は、引き算を行うケースで、計算方法に引き算を指定して、あとは足し算と同様に引数を指定し、計算結果(引き算)を表示します。

このように、計算方法を指定することで、処理を切り替えることができます。ここでは単純なif文での分岐ではなく、足し算用のファイルと引き算用のファイルをそれぞれ作成して、計算方法によって動的に読み込むようにしています。

こうすることで、動的に掛け算のプログラムや、割り算のプログラムをメインのプログラムを変更することなく追加することができます。では、実際のプログラムを次に紹介します。

プログラム

ファイルの配置構造

まず、ファイル構造について解説します。main.pyで動的にpluginディレクトリ以下のファイルを読み込み、実行します。pluginディレクトリ以下には、動的に読み込まれるプラグインファイルを配置します。ここでは、足し算用のプラグインである、sum.pyと引き算用のプラグインであるsub.pyを配置しています。

│  main.py
│  
└─plugin
        sub.py
        sum.py

プログラム(main.py)

main.pyのプログラムは以下の通りです。

# -*- coding: utf-8 -*-

import importlib

def execute_plugin(plugin_name, arg1, arg2):

    # 指定されたプラグイン名に応じて、パスを生成
    PLUGIN_DIRECTORY_NAME = "plugin"
    import_path = PLUGIN_DIRECTORY_NAME + "." + plugin_name

    # モジュールをインポート
    module = importlib.import_module(import_path)
    
    # インポートとしたモジュールを実行
    result = module.Calculator.calc(arg1,arg2)

    return result

if __name__ == "__main__":

    print("計算方法を入力してください。")
    calc_name = input()

    print("引数1を入力してください。")
    arg1 = int(input())

    print("引数2を入力してください。")
    arg2 = int(input())

    # プラグインの実行
    result = execute_plugin(calc_name, arg1, arg2)

    print(f"計算結果は、{result}です。")

ポイントは、

  • module = importlib.import_module(import_path)
  • result = module.Calculator.calc(arg1,arg2)

の部分です。この部分でモジュールを動的に読み込み、実行をしています。

注意点は、クラス名や、関数名及び引数の数などのインターフェースを各プラグインで一致させておく必要があります。

プログラム(sum.py, sub.py)

プラグインのプログラムは以下の通りです。

sum.py

# -*- coding: utf-8 -*-

class Calculator:
    @classmethod
    def calc(cls, arg1, arg2):
        return arg1 + arg2

sub.py

# -*- coding: utf-8 -*-

class Calculator:
    @classmethod
    def calc(cls, arg1, arg2):
        return arg1 - arg2

さいごに

この記事では、Pythonでプラグイン化する方法を解説しました。

プラグイン化を実装することで、

  • 疎結合なアーキテクチャの実現
  • 拡張性の向上
  • 保守性の向上

などのメリットがあります。

是非、使う場面があれば使ってみることをオススメします。

コメント