import module from string variable
我正在为嵌套Matplotlib(MPL)库编写文档(个人),它不同于MPL自己提供的感兴趣的子模块包。我正在编写python脚本,我希望它能自动从将来的MPL版本生成文档。我选择了感兴趣的子模块/包,并想列出它们的主要类,从中我将生成列表并用
问题是我找不到一种方法来指示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对上述列表的三种比较:
我不明白
请不要建议斯芬克斯作为不同的方法。
如果你改变
1 | i = __import__('matplotlib.text') |
到
1 | i = __import__('matplotlib.text', fromlist=['']) |
那么,
在python 2.7和python 3.1或更高版本中,可以使用
1 2 3 | import importlib i = importlib.import_module("matplotlib.text") |
一些注释
如果您试图从子文件夹导入某些内容,例如
./feature/email.py ,代码将类似于importlib.import_module("feature.email") 。如果要导入的文件夹中没有
__init__.py 文件,则无法导入任何内容。
你要找的是
1 2 3 | import importlib mymodule = importlib.import_module('matplotlib.text') |
此后,您可以访问模块中的任何内容,如
花了一些时间尝试从列表中导入模块,而这正是使我大部分时间都能到达的线程-但我没有掌握"导入"的用法__-
下面介绍如何从字符串中导入模块,并获得与刚才导入相同的行为。也可以尝试/排除错误情况。:)
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<,这是可行的。