[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をフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!






