2012-01-03 88 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 <,這個工程。