从字符串变量导入模块

the*_*eta 166 python matplotlib

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

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

import matplotlib.text as text
x = dir(text)
Run Code Online (Sandbox Code Playgroud)

.

i = __import__('matplotlib.text')
y = dir(i)
Run Code Online (Sandbox Code Playgroud)

.

j = __import__('matplotlib')
z = dir(j)
Run Code Online (Sandbox Code Playgroud)

以下是通过pprint对上述列表进行3种比较:

在此输入图像描述

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

请不要建议Sphinx采用不同的方法.

mzj*_*zjn 259

__import__功能可能有点难以理解.

如果你改变了

i = __import__('matplotlib.text')
Run Code Online (Sandbox Code Playgroud)

i = __import__('matplotlib.text', fromlist=[''])
Run Code Online (Sandbox Code Playgroud)

然后i会参考matplotlib.text.

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

import importlib

i = importlib.import_module("matplotlib.text")
Run Code Online (Sandbox Code Playgroud)

一些笔记

  • 如果您尝试从子文件夹导入某些内容,例如./feature/email.py,代码将如下所示importlib.import_module("feature.email")

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

  • 对于那些从谷歌来这里的人.应该注意的是,如果您尝试从子文件夹导入某些内容(例如,`./ feature/email.py`),代码将看起来像`importlib.import_module("feature.email")` (36认同)
  • 最后,还要记住,如果在您尝试导入的文件的文件夹中没有`__init __.py`,则无法导入任何内容. (9认同)
  • @mzjn这是用于`import moduleName`,其中moduleName是string.怎么样`from moduleName import*`? (3认同)
  • 对于<python2.7,`importlib`应该在pypi上可用 (2认同)
  • 刚刚在这里找到我的问题的答案,以防万一有人需要它 /sf/answers/2191461891/ (2认同)

gec*_*cco 63

importlib.import_module是你在找什么.它返回导入的模块.(仅适用于Python> = 2.7或3.x):

import importlib

mymodule = importlib.import_module('matplotlib.text')
Run Code Online (Sandbox Code Playgroud)

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

  • @gecco这是用于`import moduleName`,其中moduleName是string.怎么样`from moduleName import*`? (5认同)
  • 另一种选择是 [`imp.load_source(..)` 使用 `imp` 模块](https://docs.python.org/2/library/imp.html#imp.load_source),如本答案中建议的http: //stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path (2认同)

kee*_*een 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)
Run Code Online (Sandbox Code Playgroud)

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