2012-01-03 28 views
110

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.
He escogido submódulos/paquetes interesado y quiere una lista de sus principales clases de la que va a generar la lista y procesarla con pydocmódulo de importación desde la variable de cadena

problema es que no puedo encontrar una manera de instruir a Python para cargar submódulo de cadena. Aquí está 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í es la comparación de 3 vías de la lista de arriba a través pprint:

enter image description here

No entiendo lo que está cargado en y objeto - es la base matplotlib y algo más, pero carecen de información que yo quería y que son las principales clases del paquete matplotlib.text. Es parte superior de color azul en la captura de pantalla (x lista)

Por favor, no sugiera Sphinx como enfoque diferente.

+0

¿Puede explicar por qué necesita usar '__import __ (str)' en lugar del estándar 'import' statemetn? – thesamet

+0

Es porque procesaré las listas de qué elementos son submódulos MPL y obtendré sus rutas de métodos – theta

+4

@thesamet - vamos - hay un sinfín de ideas en las que desearía esta funcionalidad. Cuando tiene una configuración textual de bibliotecas, puede cargarlas por nombre, lo que no funcionaría con la instrucción 'import'. Aquí hay un ejemplo de uso: https://djangosnippets.org/snippets/3048/ –

Respuesta

179

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

Si cambia

i = __import__('matplotlib.text') 

a

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

continuación i se referirá a matplotlib.text.

En Python 2.7 y Python 3.1 o posterior, puede utilizar importlib:

import importlib 

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

Algunas notas

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

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

+2

'importlib' debe estar disponible en pypi para

+4

Sí, es: http://pypi.python.org/pypi/importlib/. – mzjn

+29

Para cualquiera que venga aquí desde Google. Debe tenerse en cuenta que si intenta importar algo desde una subcarpeta (por ejemplo, './Feature/email.py'), el código se verá como' importlib.import_module ("feature.email") ' – Seanny123

47

Creo que importlib.import_module es lo que estás buscando. (Sólo disponible para Python> = 2.7 o 3.x):

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

Una alternativa es ['imp.load_source (..)' utilizando el módulo 'imp'] (https://docs.python.org/ 2/library/imp.html # imp.load_source) como se sugiere en esta respuesta http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path –

+2

@gecco This es para 'import moduleName' donde moduleName es cadena. ¿Qué tal 'de moduleName import *'? –

4

pasado 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í se explica 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> usted tiene otras opciones - pero para < 2.6, esto funciona.

Cuestiones relacionadas