2012-01-03 97 views
110

我正在为嵌套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建议为不同的方法。

+0

你能解释为什么你需要使用'__import __(str)'而不是标准'import' statemetn吗? – thesamet 2012-01-03 21:53:23

+0

这是因为我会处理列出哪些项目是MPL子模块并获得他们的方法路径 – theta 2012-01-03 22:00:38

+4

@thesamet - 来吧 - 有无尽的想法,你想要这个功能。当你有一个库的文本配置时,你可以通过名称来加载它们,这对于'import'语句来说并不合适。下面是一个使用示例:https://djangosnippets.org/snippets/3048/ – 2014-05-12 04:55:42

回答

179

__import__功能可有点难以理解。

如果更改

i = __import__('matplotlib.text') 

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

然后i将参考matplotlib.text

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

import importlib 

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

的一些注意事项

  • 如果你想从一个子文件夹,例如进口的东西./feature/email.py,代码看起来像importlib.import_module("feature.email")

  • 您不能导入什么,如果有一个与文件的文件夹中没有__init__.py你要导入

+2

'importlib'应该可以在pypi上使用 2012-08-19 12:12:02

+4

是的,它是:http://pypi.python.org/pypi/importlib/。 – mzjn 2012-08-19 12:57:20

+29

对于来自Google的任何人。应该注意的是,如果你想从子文件夹中导入某些东西(例如,'。/ feature/email.py'),代码将看起来像'importlib.import_module(“feature.email”)' – Seanny123 2013-12-06 07:13:47

47

我认为importlib.import_module是你在找什么。 (仅可用于Python> = 2.7或3.X):

importlib.import_module('matplotlib.text') 
+0

另一种方法是使用'imp'模块['imp.load_source(..)'](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 – 2014-06-08 06:30:54

+2

@gecco这用于'import moduleName',其中moduleName是字符串。怎么样'从moduleName导入*'? – 2017-05-30 06:57:01

4

花了一些时间,试图从导入模块列表中,并且这是让我获得大部分途径的线程 - 但我没有掌握___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 <,这个工程。