pythonダイナミックインポートモジュール

1068 ワード

目的は、コンフィギュレーションファイルから実行時に適用すべきモジュールを切り替えることです.C#を使うときは複雑です.静的言語なので、動的に切り替えるには反射を使うしかありません.pythonは簡単です.実行するコードの前に動的にimportすれば、目的を達成できます.
パッケージ「mypackage」があるとします.中にはmodule:md 01が3つあります.py, md02.pyとmd 03.py、中で実現したのは同じ方法です
def getstr():

    return "from md01/2/3"

うち123はmoudleによって異なります
どうやって使うの?
from xml.dom import minidom





if __name__=="__main__":

    #    xml    ,  moudle  

    xml='''<?xml version="1.0"?><root><moudle>md03</moudle></root>'''

    p=minidom.parseString(xml)

    mdname=p.getElementsByTagName("moudle")[0].firstChild.data

    mymod=__import__("mypackage."+mdname,fromlist=["*"])#fromlist   

    print mymod.getstr()

テスト中、唯一無視されたのは__です.import__中のfromlistパラメータは、どうしてもモジュールが得られず、パッケージしか得られません.fromlistにインポートに参加する可能性のあるモジュール名を書き込むためです.
これは素晴らしいデザインです.もしあなたのこのバッグが非常に巨大であれば、いくつかのモジュールが参加するだけで、そのいくつかのモジュール名を書けばいいです.
自分のパッケージのモジュールをインポートした場合、fromlistは空またはそのパラメータを送信すればよい.