módulo de importación desde la cadena de variables

Estoy trabajando en una documentación (personal) para la biblioteca de matplotlib (MPL) anidada, que difiere de la MPL proporcionada por los paquetes de submódulos interesados. Estoy escribiendo un script de Python que espero automatice la generación de documentos de futuras versiones de MPL.
Seleccioné los submódulos / paquetes interesados ​​y quiero enumerar sus clases principales a partir de las cuales pydoc lista y procesarla con pydoc

El problema es que no puedo encontrar una manera de indicarle a Python que cargue el submódulo de la cadena. Aquí hay un ejemplo de lo que intenté:

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

.

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

.

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

Y aquí hay una comparación de 3 formas de las listas anteriores a través de pprint:

introduzca la descripción de la imagen aquí

No entiendo lo que está cargado en el objeto y es la base matplotlib más otra cosa, pero carece de la información que quería y esa es la clase principal del paquete matplotlib.text . Es la parte superior de color azul en la captura de pantalla ( x lista)

Por favor, no sugiera Sphinx como enfoque diferente.

La función __import__ puede ser un poco difícil de entender.

Si cambias

 i = __import__('matplotlib.text') 

a

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

entonces i referiré a matplotlib.text .

En Python 2.7 y Python 3.1 o posterior, puedes usar importlib :

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

Algunas notas

  • Si está intentando importar algo de una subcarpeta, por ejemplo, ./feature/email.py , el código se verá como importlib.import_module("feature.email")

  • No puede importar nada si no hay __init__.py en la carpeta con el archivo que está intentando importar

importlib.import_module es lo que está buscando. Devuelve el módulo importado. (Solo disponible para Python> = 2.7 o 3.x):

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

Después puede acceder a cualquier elemento del módulo como mymodule.myclass , etc.

Pasé un tiempo tratando de importar módulos de una lista, y este es el hilo que me ayudó a llegar hasta allí, pero no entendí el uso de ___import____ –

así que aquí está cómo importar un módulo desde una cadena y obtener el mismo comportamiento que solo importar. Y prueba / excepto el caso de error, también. 🙂

  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) 

y sí, para Python 2.7> tiene otras opciones, pero para 2.6 <, esto funciona.