代码之家  ›  专栏  ›  技术社区  ›  Stephen Diehl

从模块动态导入所有内容(*)

  •  21
  • Stephen Diehl  · 技术社区  · 14 年前

    我有一个Python模块,只要给定一个模块名字符串,我就想动态导入它。通常我用 importlib __import__ 考虑到我知道要从模块中导入哪些对象,这个方法非常有效,但是有没有一种方法可以等效于 import *

    我知道总的来说这是不好的做法 进口* 但是我试图导入的模块是动态自动生成的,我无法知道包含我正在寻址的类的确切模块。

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  5
  •   GWW    14 年前

    我想出了一些难看的黑客代码,它在Python2.6中工作。不过,我不确定这是否是最明智的做法,也许这里的其他一些人有一些见解:

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

    您可能需要在此处进行检查,以确保不会覆盖全局命名空间中的任何内容。您可以避免使用globals部分,只需查看每个动态导入的模块以了解您感兴趣的类。这可能比用导入的所有内容污染全局命名空间要好得多。

    例如,假设您的类名为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')
    
        2
  •  26
  •   warvariuc    7 年前

    使用 update

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

    注意,使用 a_module.__dict__ from a_module import * __all__ 或者不是从 _ .

        3
  •  3
  •   Patrick    8 年前

    以下的行为是非常罪恶的,会使你陷入炼狱或更糟的境地

    # module A
    myvar = "hello"
    
    # module B
    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
    from module B import dyn_import_all
    def print_from(modpath):
      dyn_import_all(modpath)
      print(myvar)