2012-01-03 5 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) 

А вот 3 способа сравнения выше списков через pprint:

enter image description here

Я не понимаю, что загружается в y объект - это база matplotlib плюс что-то еще, но не хватает информации что я хотел, и это основные классы от matplotlib.text. Это верхняя часть синего цвета на снимке экрана (x)

Пожалуйста, не предлагайте Sphinx как другой подход.

+0

Можете ли вы объяснить, почему вам нужно использовать '__import __ (str)', а не стандартный 'import' statemetn? – thesamet

+0

Это потому, что я обработаю списки, которые являются подмодулями MPL и получат пути их методов. – theta

+4

@thesamet - c'mon - есть бесконечные идеи, в которых вы хотели бы использовать эту функциональность. Когда у вас есть текстовая конфигурация библиотек, вы можете загрузить их по имени, что не будет работать с оператором 'import'. Вот один из примеров использования: https://djangosnippets.org/snippets/3048/ –

ответ

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 для

+4

Да, это: http://pypi.python.org/pypi/importlib/. – mzjn

+29

Для тех, кто приезжает сюда из Google. Следует отметить, что если вы пытаетесь импортировать что-то из подпапки (например, './Feature/email.py'), код будет выглядеть как' importlib.import_module ("feature.email") ' – Seanny123

47

Я думаю, что importlib.import_module - это то, что вы ищете. (Доступно только для Python> = 2.7 или 3.x):

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

Альтернативой является ['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

@gecco Это для 'import moduleName', где moduleName - строка. Как насчет 'from moduleName import *'? –

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 <, это работает.

Смежные вопросы