关于python:从字符串变量导入模块

import module from string variable

我正在为嵌套Matplotlib(MPL)库编写文档(个人),它不同于MPL自己提供的感兴趣的子模块包。我正在编写python脚本,我希望它能自动从将来的MPL版本生成文档。我选择了感兴趣的子模块/包,并想列出它们的主要类,从中我将生成列表并用pydoc处理它。

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

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

.

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

.

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

下面是通过pprint对上述列表的三种比较:

enter image description here

我不明白y对象中加载了什么——它是基础matplotlib加上其他东西,但它缺少我想要的信息,这是matplotlib.text包中的主要类。屏幕截图上的顶部蓝色部分(x列表)

请不要建议斯芬克斯作为不同的方法。


__import__函数可能有点难以理解。

如果你改变

1
i = __import__('matplotlib.text')

1
i = __import__('matplotlib.text', fromlist=[''])

那么,imatplotlib.text

在python 2.7和python 3.1或更高版本中,可以使用importlib

1
2
3
import importlib

i = importlib.import_module("matplotlib.text")

一些注释

  • 如果您试图从子文件夹导入某些内容,例如./feature/email.py,代码将类似于importlib.import_module("feature.email")

  • 如果要导入的文件夹中没有__init__.py文件,则无法导入任何内容。


你要找的是importlib.import_module。它返回导入的模块。(仅适用于python>=2.7或3.x):

1
2
3
import importlib

mymodule = importlib.import_module('matplotlib.text')

此后,您可以访问模块中的任何内容,如mymodule.myclass等。


花了一些时间尝试从列表中导入模块,而这正是使我大部分时间都能到达的线程-但我没有掌握"导入"的用法__-

下面介绍如何从字符串中导入模块,并获得与刚才导入相同的行为。也可以尝试/排除错误情况。:)

1
2
3
4
5
6
7
8
9
10
11
  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 +"
"
)
          sys.exit(1)

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