Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python モジュール・関数の動的なインポート

概要

開発したPythonスクリプトに対して、ユーザが処理(関数)を簡単に追加できるようにする方法として importlib が使えそうだったので、試してみました。

フォルダ構成

root/
 ├ main.py
 └  plugins/
   └ my_funcs.py

実装

ユーザが追加する関数には、あらかじめ開発者側が指定する引数と独自の引数を両方とれるように、後者を**paramsという形で渡します。

このようにすることで、特定の信号やデータを対象としたユーザ独自処理の追加が実現できます。

main.py

import sys
import importlib


def run_custom_func(module_name, func_name, params):
    module = importlib.import_module(module_name)
    func = getattr(module, func_name)
    func("Run your module", **params)

if __name__ == "__main__":
    print(sys.version)
    params = {"name": "Alice", "age": 10}
    run_custom_func('plugins.my_funcs', "hoge", params)

my_funcs.py

def hoge(context, name="", age=-1):
    print(context)
    print(name, age)

実行結果

>python main.py
3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]
Run your module
Alice 10