从字符串变量导入模块

时间:2012-01-03 21:29:38

标签: python matplotlib

我正在研究嵌套matplotlib(MPL)库的文档(个人),它与MPL自己提供的有趣的子模块包不同。我正在编写Python脚本,我希望将从未来的MPL版本中自动生成文档 我选择了感兴趣的子模块/包,并希望列出我将生成列表的主要类,并使用pydoc

处理它

问题是我找不到一种方法来指示Python从字符串加载子模块。这是我尝试的例子:

import matplotlib.text as text
x = dir(text)

i = __import__('matplotlib.text')
y = dir(i)

j = __import__('matplotlib')
z = dir(j)

以下是通过pprint的上述列表的3种方式比较:

enter image description here

我不明白y对象中加载了什么 - 它是基础matplotlib加上其他东西,但它缺少我想要的信息,而且是来自matplotlib.text包的主要类。它是屏幕截图(x列表)

的顶部蓝色部分

请不要建议Sphinx作为不同的方法。

3 个答案:

答案 0 :(得分:6)

花了一些时间尝试从列表中导入模块,这是让我大部分时间都在那里的线程 - 但我没有掌握使用___import____ -

所以这里是如何从字符串导入模块,并获得与导入相同的行为。并且尝试/除了错误情况。 :)

  pipmodules = ['pycurl', 'ansible', 'bad_module_no_beer']
  for module in pipmodules:
      try:
          # because we want to import using a variable, do it this way
          module_obj = __import__(module)
          # create a global object containging our module
          globals()[module] = module_obj
      except ImportError:
          sys.stderr.write("ERROR: missing python module: " + module + "\n")
          sys.exit(1)

是的,对于python 2.7>你还有其他的选择 - 但对于2.6<,这是有效的。

答案 1 :(得分:2)

除了使用importlib之外,还可以使用exec方法从字符串变量中导入模块。

这里我展示了一个使用combinations方法从itertools包中导入exec方法的示例:

MODULES = [
    ['itertools','combinations'],
]

for ITEM in MODULES:
    import_str = "from {0} import {1}".format(ITEM[0],', '.join(str(i) for i in ITEM[1:]))
    exec(import_str)

ar = list(combinations([1, 2, 3, 4], 2))
for elements in ar:
    print(elements)

输出:

(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)

答案 2 :(得分:0)

我开发了这三个有用的功能:

def loadModule(moduleName):
    module = None
    try:
        import sys
        del sys.modules[moduleName]
    except BaseException as err:
        pass
    try:
        import importlib
        module = importlib.import_module(moduleName)
    except BaseException as err:
        serr = str(err)
        print("Error to load the module '" + moduleName + "': " + serr)
    return module

def reloadModule(moduleName):
    module = loadModule(moduleName)
    moduleName, modulePath = str(module).replace("' from '", "||").replace("<module '", '').replace("'>", '').split("||")
    if (modulePath.endswith(".pyc")):
        import os
        os.remove(modulePath)
        module = loadModule(moduleName)
    return module

def getInstance(moduleName, param1, param2, param3):
    module = reloadModule(moduleName)
    instance = eval("module." + moduleName + "(param1, param2, param3)")
    return instance

每次我想重新加载新实例时,都只需要这样调用getInstance():

myInstance = getInstance("MyModule", myParam1, myParam2, myParam3)

最后,我可以调用新实例中的所有函数:

myInstance.aFunction()

这里唯一的特异性是自定义实例的参数列表(param1,param2,param3)。