импортировать модуль из строковой переменной - PullRequest
159 голосов
/ 04 января 2012

Я работаю над документацией (персональной) для библиотеки nested 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 список)

Пожалуйста, не предлагайте Сфинкс в качестве другого подхода.

Ответы [ 3 ]

244 голосов
/ 04 января 2012

Функция __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

61 голосов
/ 04 января 2012

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

import importlib

mymodule = importlib.import_module('matplotlib.text')

После этого вы можете получить доступ ко всему в модуле как mymodule.myclass и т. Д.

6 голосов
/ 21 февраля 2015

потратил некоторое время, пытаясь импортировать модули из списка, и это поток, который помог мне пройти большую часть пути - но я не понял использования ___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 <это работает. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...