29

モジュール名の文字列のみを指定して、動的にインポートしたい Python モジュールがあります。通常、私はimportliborを使用__import__します。モジュールからインポートするオブジェクトがわかっている場合、これは非常にうまく機能しますが、import *動的に同等のことを行う方法はありますか。または、より良いアプローチがありますか?

一般的に、使用するのが悪い習慣であることは知っていますimport *が、インポートしようとしているモジュールはその場で自動的に生成され、アドレス指定しているクラスを含む正確なモジュールを知る方法がありません。

ありがとう。

4

3 に答える 3

26

ディクテーションに使用update:

globals().update(importlib.import_module('some.package').__dict__)

a_module.__dict__usingは と同じではないfrom a_module import *こと__all__に注意してください_.

于 2010-12-24T13:59:35.103 に答える
4

以下は非常に罪深いものであり、あなたを煉獄またはそれ以上の罪に定めます

# module_a.py
myvar = "hello"

# module_b.py
import inspect
def dyn_import_all(modpath):
    """Incredibly hackish way to load into caller's global namespace"""
    exec('from ' + modpath + ' import *', inspect.stack()[1][0].f_globals)

# module_c.py
from module_b import dyn_import_all
def print_from(modpath):
    dyn_import_all(modpath)
    print(myvar)

デモ:

>>> import module_c
>>> module_c.print_from("module_a")
hello
于 2016-06-16T14:19:01.247 に答える
4

私はいくつかの醜いハッキーコードを思いつきました.それはpython 2.6で動作します. これが最も賢明なことかどうかはわかりませんが、おそらくここにいる他の人がいくつかの洞察を持っています:

test = __import__('os',globals(),locals())
for k in dir(test):
    globals()[k] = test.__dict__[k]

グローバル名前空間で何も上書きしていないことを確認するために、ここにチェックを入れたいと思うでしょう。おそらくグローバル部分を避けて、動的にインポートされた各モジュールを調べて、関心のあるクラスを見つけることができます。これは、インポートするすべてのものでグローバル名前空間を汚染するよりも、おそらくはるかに優れています。

たとえば、クラスの名前が Request from urllib2 であるとします。

test = __import__('urllib2',globals(),locals())
cls = None
if 'Request' in dir(test):
    cls = test.__dict__['Request']
    # you found the class now you can use it!
    cls('http://test.com')
于 2010-11-07T01:38:32.073 に答える