5

名前を事前に知らずにサブモジュールをインポートしたいのですが、

>>> __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()ますか?

4

2 に答える 2

3

from A import B as C関数呼び出しとしてdo: を実行したい場合は、モジュールではない可能性があるためimportlib.import_module、常に機能するとは限りません。B

importlib と getattr を使用する関数を次に示します。

def my_import_from(mod_name, var_name):
    import importlib
    mod = importlib.import_module(mod_name)
    var = getattr(mod, var_name)
    return var

したがって、この:

from os.path import dirname as var

これに置き換えることができます:

var = my_import_from("os.path", "dirname")

exec を回避し、サブモジュールとモジュールで定義された変数の両方を許可します。

私の質問はサブモジュールをインポートすることを明示的に言っているので、@Bakuriu からの答えは正しいですが、完全を期すためにこれを含めると、同じ問題に遭遇した他の人を助けるかもしれません。

于 2013-09-28T09:46:37.213 に答える