2010-06-28 13 views
21

Esto probablemente tiene una respuesta obvia, pero yo soy un principiante. Tengo un "módulo" (en realidad solo un archivo con varias funciones que uso a menudo) al principio del cual importo varios otros módulos. Debido a que trabajo en muchos sistemas, sin embargo, no todos los módulos pueden cargarse en una máquina en particular. Para hacer las cosas un poco más difíciles, también cambio los nombres de los paquetes cuando los importo; por ejemplo, matplotlib se abrevia a mp.Error al manejar los módulos

Lo que me gustaría hacer es cargar solo aquellos módulos que existen en el sistema que estoy usando actualmente, y hacer un manejo de errores en los que no lo hacen. La única forma en que puedo pensar en hacerlo es adjuntando cada declaración de importación dentro de su propio bloque try, que parece bastante antipático. Si los adjunto a todos en el mismo bloque de prueba, el módulo arroja un error que impedirá que se carguen los módulos subsiguientes. ¿Alguna idea que pueda hacer que las cosas se vean más bonitas? Sería tan fácil si no quisiera cambiar sus nombres ...

+2

el módulo "imp" debería ayudarle. Es posible que desee leer esto: http://docs.python.org/library/imp.html – mawimawi

+1

@mawimawi: ¿Cómo? Por favor explique y expanda su comentario en una respuesta correcta? (Leí el documento y no es obvio por qué querríamos usar ese módulo más que cualquier otro método ) – smci

Respuesta

30

No creo que el bloque try except no sea pitónico; en su lugar, es una forma común de manejar importación en Python.

Citando Dive into Python:

Hay muchos otros usos para excepciones además de la manipulación verdaderas condiciones de error. Un uso común en la biblioteca de Python estándar es intentar importar un módulo, y luego marcar si funcionó. La importación de un módulo que no existe generará una excepción ImportError. Puede utilizar este para definir múltiples niveles de funcionalidad basado en qué módulos están disponibles en tiempo de ejecución, o para Soporte de múltiples plataformas (donde código específico de la plataforma se separa en diferentes módulos).

El siguiente ejemplo muestra cómo usar una excepción para admitir la funcionalidad específica de la plataforma .

try: 
    import termios, TERMIOS      
except ImportError: 
    try: 
     import msvcrt       
    except ImportError: 
     try: 
      from EasyDialogs import AskPassword 
     except ImportError: 
      getpass = default_getpass   
     else:         
      getpass = AskPassword 
    else: 
     getpass = win_getpass 
else: 
    getpass = unix_getpass 
4

La manera más fácil es para asegurar que todos los módulos pueden ser cargados en todos los sistemas. Si eso no funciona, adjuntar cada instrucción import en un bloque try es la siguiente mejor solución y no es antiponética en absoluto.

0

como se propone en https://stackoverflow.com/a/20228312/1587329 [modificar]

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand) 
for (name, short) in named_libs: 
    try: 
     lib = __import__(name) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[short] = lib 

importa todos bibliotecas en named_libs. La primera cadena es el nombre de la biblioteca, el segundo la abreviatura. Para las bibliotecas sin nombre, puede utilizar the original:

libnames = ['numpy', 'scipy', 'operator'] 
for libname in libnames: 
    try: 
     lib = __import__(libname) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[libname] = lib 
Cuestiones relacionadas