【问题标题】:Python: import modules dynamically in different namespacePython:在不同的命名空间中动态导入模块
【发布时间】:2012-04-13 19:59:39
【问题描述】:
import v_framework as framework
framework.loadModules(["Maintenance"])
framework.Maintenance.showPage()

framework 我有:

def loadModules(aModules):
    d_utility = {"Maintenance":"COOl_M_PAGE"}
    for module in a_aModules:
        exec("import " + d_utility[module] + " as " + module)

loadModules 执行时,它会导入v_framework 命名空间中的模块。由于我将v_framework 导入为framework,我想我应该能够使用framework.Maintenance 使用导入的模块。但它不是那样工作的。 有没有办法做我想做的事情?或者,除了执行exec 的命名空间之外,还有什么方法可以在命名空间中导入模块?

【问题讨论】:

    标签: python namespaces import


    【解决方案1】:

    有用于动态导入模块的库。您可以使用importlib(另一个可能有用的是pkgutil)。现在,对于您的情况,我想这可以完成这项工作:

    import importlib
    mods = {}
    def loadModules(aModule):
        global mods
        mods[module] = importlib.import_module(d_utility[module])
        # or maybe globals()[module] = ... would work also (exactly as you expect it to
    

    更新: exec 修改函数的本地命名空间,而不是全局命名空间(我认为)。

    希望对您有所帮助。 :)

    【讨论】:

      【解决方案2】:

      当您在函数内import 时,模块会正常导入/执行,但您导入时使用的名称是函数的本地名称,就像在函数内分配的任何其他变量一样。

      >>> def test_import():
      ...    import os
      ...    print os
      ...
      >>> test_import()
      <module 'os' from '/usr/lib/python2.7/os.pyc'>
      >>> os
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      NameError: name 'os' is not defined
      

      os已经被导入,你仍然可以通过sys.modules访问它:

      >>> import sys
      >>> sys.modules['os']
      <module 'os' from '/usr/lib/python2.7/os.pyc'>
      >>> os = sys.modules['os']
      >>> os
      <module 'os' from '/usr/lib/python2.7/os.pyc'>
      

      一种快速而肮脏的方式来做你想做的事情是这样的; exec 采用可选映射作为局部和全局变量。所以你可以这样做

      def loadModules(aModules):
          d_utility = {"Maintenance":"COOl_M_PAGE"}
          for module in aModules:
              exec ('import %s as %s' % (d_utility[module], module)) in globals()
      

      虽然这很丑陋并且可能具有安全隐患或其他东西。正如 jadkik94 所提到的,有些库提供了更简洁的方法来处理这个问题。

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 2019-01-08
        • 2011-06-26
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2011-04-08
        相关资源
        最近更新 更多