名前を事前に知らずにサブモジュールをインポートしたいのですが、
>>> __import__("os.path")
<module 'os' from '/usr/lib/python3.3/os.py'>
期待どおりに動作せずos
、 ではなくを返しos.path
ます。
私はこの解決策を思いつきました。
def import_submodule(mod, submod):
ns = {}
exec_str = "from %s import %s as submod" % (mod, submod)
exec(exec_str, ns, ns)
return ns["submod"]
これにより、次の結果が得られます。
>>> import_submodule("os", "path")
<module 'posixpath' from '/usr/lib/python3.3/posixpath.py'>
しかし、私はむしろ exec() を使用したくありません。なぜなら、それはかなり悪い習慣であり、Python のインポート メカニズムが__import__
、imp
およびimportlib
モジュールを通じてすでに利用可能である場合には不必要に思われるからです。
を使用するのではなく、関数呼び出しを介してこの種のインポートを Python3.x で行う方法はありexec()
ますか?