import modułu ze zmiennej string

Pracuję nad dokumentacją (osobistą) dla zagnieżdżonej biblioteki matplotlib (MPL), która różni się od MPL własnej dostarczonej przez zainteresowane Pakiety podmodułów. Piszę skrypt Pythona, który mam nadzieję zautomatyzuje generowanie dokumentów z przyszłych wydań MPL.
Wybrałem interesujące podmoduły/pakiety i chcę wyświetlić listę ich głównych klas, z których wygeneruję listę i przetworzę ją za pomocą pydoc

Problem polega na tym, że nie mogę znaleźć sposobu, aby polecić Pythonowi Ładowanie podmodułu z string. Oto przykład tego, czego próbowałem:

import matplotlib.text as text
x = dir(text)

.

i = __import__('matplotlib.text')
y = dir(i)

.

j = __import__('matplotlib')
z = dir(j)

A oto 3-drożne porównanie powyższych list przez pprint:

Tutaj wpisz opis obrazka

Nie rozumiem, co jest załadowane w y object - to baza matplotlib plus coś innego, ale brakuje w niej informacji, które chciałem i to są główne klasy z matplotlib.text pakietu. Jest to górna niebieska część na zrzucie ekranu (x lista)

Proszę nie sugerować Sfinksa jako innego podejścia.

Author: theta, 2012-01-04

3 answers

Funkcja __import__ może być nieco trudna do zrozumienia.

Jeśli zmienisz

i = __import__('matplotlib.text')

Do

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

Wtedy i będzie odnosić się do matplotlib.text.

W Pythonie 2.7 i Pythonie 3.1 lub nowszym można użyć importlib:
import importlib

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

Niektóre notatki

  • Jeśli próbujesz zaimportować coś z podfolderu np. ./feature/email.py, kod będzie wyglądał tak:importlib.import_module("feature.email")

  • Nie możesz niczego importować, jeśli nie ma __init__.py w folderze z plikiem, który próbujesz aby zaimportować

 205
Author: mzjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 06:37:27

Myślę importlib.import_module jest tym, czego szukasz. (Dostępne tylko dla Pythona >= 2.7 lub 3.x):

importlib.import_module('matplotlib.text')
 55
Author: gecco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-03 21:49:58

Spędziłem trochę czasu próbując zaimportować moduły z listy, i to jest wątek, który najbardziej mnie tam zainteresował-ale nie zrozumiałem użycia _ _ _ import _ _ _ _ -

Oto jak zaimportować moduł z ciągu znaków i uzyskać takie samo zachowanie jak po prostu import. I spróbuj / z wyjątkiem przypadku błędu, zbyt. :)

  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)

I tak, dla Pythona 2.7> masz inne opcje - ale dla 2.6

 5
Author: keen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 23:03:38