ネストしたモジュールをimportする関数


ビルトイン関数__import__ は 文字列を引数にとり、import文と同様の事をする関数です。


プログラム実行中に動的にモジュールをimportするときなどに使えるのですが、
__import__はimportと全く同じではありません。ネストしたモジュールをimport出来ないのです。

mod = __import__("level1.level2.spam")
print(mod)
# <module 'level1' from 'D:\Owner\temp\level1\__init__.py'>
# level1.level2.spamではない!!



Python 2.6のヘルプに解決法がありました。

テストに使ったファイル・ディレクトリ構造
│  import_test.py
│
└─level1
    │  __init__.py
    │
    └─level2
            spam.py
            __init__.py
#Python 2.6ヘルプを参考に
#encoding:shift-jis
from __future__ import with_statement, division, print_function

mod &#061; __import__("level1.level2.spam")
print(mod)
# <module 'level1' from 'D:\Owner\temp\level1\__init__.py'>
# level1.level2.spamではない!!


def nested_import(name):
    #ネストしたモジュールをimport出来る関数
    import sys
    __import__(name)
    return sys.modules[name]

mod &#061; nested_import("level1.level2.spam")
print(mod)
# <module 'level1.level2.spam' from 'D:\Owner\temp\level1\level2\spam.pyc'>
# ok !

mod &#061; nested_import("level1")
print(mod)
# <module 'level1' from 'D:\Owner\temp\level1\__init__.py'>
# もちろん、ネストしていなくてもimport出来る