[Python] 文字列で指定したモジュールを、動的にインポートを行う
こんにちは、@yoheiMuneです。
最近のPythonの実装で、ジョブ名をコマンドライン引数から渡し、それに該当するモジュールを動的に読み込んで処理する、という実装を行いました。その際に、文字列からモジュールを読み込む実装を行なったので、今日はそれをブログに書きたいと思います。
今回は、以下のようなファイル構成とします。
また、
https://docs.python.jp/3/library/importlib.html#importlib.import_module
最後になりますが本ブログでは、Python・Go言語・Linux・フロントエンド・Node.js・インフラ・開発環境・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
最近のPythonの実装で、ジョブ名をコマンドライン引数から渡し、それに該当するモジュールを動的に読み込んで処理する、という実装を行いました。その際に、文字列からモジュールを読み込む実装を行なったので、今日はそれをブログに書きたいと思います。
目次
動的インポート(Dynamic Import)
Pythonで動的インポートを行うには、importlibという標準パッケージを利用します。このパッケージはimport
文の挙動を定義していますが、その仕組みを使うことで、文字列から動的にモジュールを読み込むことができます。今回は、以下のようなファイル構成とします。
# フォルダ構成 - main.py - jobs/ - apple.py - orange.pyここでは、
jobs/apple.py
とjobs/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の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!