python - importar el módulo de la variable de cadena
title python (3)
Estoy trabajando en una documentación (personal) para la biblioteca matplotlib anidada (MPL), que difiere de la MPL propia provista, por paquetes de submódulos interesados. Estoy escribiendo un script de Python que espero automatice la generación de documentos a partir 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 la procesaré con pydoc
El problema es que no puedo encontrar la manera de ordenar a Python que cargue el submódulo desde la cadena. Aquí hay un ejemplo de lo que probé:
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 maneras de las listas anteriores a través de pprint:
No entiendo lo que está cargado en el objeto y
- es matplotlib
base más algo más, pero falta la información que quería y son las clases principales del paquete matplotlib.text
. Es la parte superior de color azul en la captura de pantalla (lista x
)
Por favor, no sugiera Sphinx como un enfoque diferente.
Creo que importlib.import_module es lo que estás buscando. (Solo disponible para Python> = 2.7 o 3.x):
importlib.import_module(''matplotlib.text'')
La función __import__
puede ser un poco difícil de entender.
Si cambias
i = __import__(''matplotlib.text'')
a
i = __import__(''matplotlib.text'', fromlist=[''''])
luego i
referiré a matplotlib.text
.
En Python 2.7 y Python 3.1 o posterior, puede usar importlib
:
import importlib
i = importlib.import_module("matplotlib.text")
Algunas notas
Si intenta importar algo de una subcarpeta, por ejemplo,
./feature/email.py
, el código se verá comoimportlib.import_module("feature.email")
No puede importar nada si no hay
__init__.py
en la carpeta con el archivo que está intentando importar
Pasé algún tiempo tratando de importar módulos de una lista, y este es el hilo que me llevó la mayor parte del camino, pero no entendí el uso de ___import____ -
así que aquí está cómo importar un módulo de una cadena, y obtener el mismo comportamiento que solo importar. Y pruebe / 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> tienes otras opciones, pero para 2.6 <, esto funciona.