2017/10/10更新

[Python] 文字列で指定したモジュールを、動的にインポートを行う

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
最近のPythonの実装で、ジョブ名をコマンドライン引数から渡し、それに該当するモジュールを動的に読み込んで処理する、という実装を行いました。その際に、文字列からモジュールを読み込む実装を行なったので、今日はそれをブログに書きたいと思います。
画像


目次




動的インポート(Dynamic Import)

Pythonで動的インポートを行うには、importlibという標準パッケージを利用します。このパッケージはimport文の挙動を定義していますが、その仕組みを使うことで、文字列から動的にモジュールを読み込むことができます。

今回は、以下のようなファイル構成とします。
# フォルダ構成
- main.py
- jobs/
    - apple.py
    - orange.py
ここでは、jobs/apple.pyjobs/orange.pyを動的に読み込んでみたいと思います。それぞれの中身は以下の通りです。
class Worker(object):
    @staticmethod
    def greeting():
        print("Hello from Apple")
class Worker(object):
    @staticmethod
    def greeting():
        print("Hello from Orange")
それぞれのファイルでWorkerクラスが定義されていて、Workerクラスはgreetingという関数を持つ構造です。



importlibを用いた動的インポートの実装

importlibパッケージの中のimport_moduleを用いることで、動的にモジュールを読み込むことができます。具体的には以下のように実装します。
from importlib import import_module

# appleを読み込む
module1 = import_module("jobs.apple")
module1.Worker.greeting()  # Hello from Apple

# orangeを読み込む
module2 = import_module("jobs.orange")
module2.Worker.greeting()  # Hello from Orange
このように文字列で指定したモジュールをimport_moduleを使うことで、読み込むことができます。

また、import_moduleには第二引数に、読み込み起点となるパッケージを指定することもできます。下記の例ではjobsパッケージを読み込み起点にしています。
# appleを読み込む(パッケージを指定した場合)
module1 = import_module(".apple", "jobs")
module1.Worker.greeting()
このような感じで、Pythonではダイナミックインポートを実現することができます。



参考資料

以下の公式ドキュメントを参照しました。ありがとうございます。

https://docs.python.jp/3/library/importlib.html#importlib.import_module



最後に

調べると実現したいことが見つかる感じ、Pythonなかなか素敵だなと思いました。今後のバッチ処理とかにも使っていけたらと思います。

最後になりますが本ブログでは、Python・Go言語・Linux・フロントエンド・Node.js・インフラ・開発環境・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。