2009-04-20 23 views
7

¿Cómo podría uno probar si un conjunto de módulos está instalado, dados los nombres de los módulos? P.ej.Prueba de las dependencias del módulo Python instaladas

modules = set(["sys", "os", "jinja"]) 

for module in modules: 
    # if test(module exists): 
    # do something 

Mientras que es posible escribir a cabo las pruebas como:

try: 
    import sys 
except ImportError: 
    print "No sys!" 

Esto es un poco engorroso para lo que estoy haciendo. ¿Hay una manera dinámica de hacer esto?

He intentado con eval ("import% s"% module) pero me he quejado de un error de compilación.

Agradezco sus pensamientos y sugerencias. Gracias.

Respuesta

8

Usted puede utilizar la función de __import__() como esto ::

for module in modules: 
    try: 
     __import__(module) 
    except ImportError: 
     do_something() 

También puede utilizar imp.find_module para determinar si un módulo se puede encontrar sin importar que ::

import imp 
for module in modules: 
    try: 
     imp.find_module(module) 
    except ImportError: 
     do_something() 

Oh, y la razón por la que no puede usar eval() es porque import es una declaración, no una expresión. Usted puede uso exec si realmente desea, aunque yo no lo recomendaría ::

for module in modules: 
    try: 
     exec 'import ' + module 
    except ImportError: 
     do_something() 
6

¿Qué pasa con esto?

modules = set(["sys", "os", "jinja"]) 
for m in modules: 
    try: 
     __import__(m) 
    except ImportError: 
     # do something 

los usos anteriores, la función de __import__. Además, se está probando estrictamente si existe o no, en realidad no guarda la importación en ningún lugar, pero podría modificarla fácilmente para hacerlo.

2
modules = set(["sys", "os", "jinja"]) 
try: 
    for module in modules: 
    __import__(module) 
    doSomething() 
except ImportError, e: 
    print e 
5

Vale la pena entender las ventajas y desventajas entre el enfoque y la find_module __import__ enfoque:

  • __import__('foo') disparará los efectos secundarios de la carga del módulo, independientemente de si guarda una referencia al módulo importado. Eso podría estar bien, o no.
  • find_module('foo') no activará ningún efecto secundario, por lo que siempre debe ser seguro.
  • ninguno de estos enfoques funciona bien si el módulo se encuentra, pero tiene otros problemas en el tiempo de carga (por ejemplo. SyntaxError, NameError, ...)
  • Dependiendo de la forma de manejar los fallos, simplemente envolviendo __import__('foo') en un try/excepto dará usted resultados engañosos si se encuentra foo pero foo importa la barra que es no encontrado.
  • find_module() no puede manejar nombres de puntos, por lo que si es necesario comprobar si 'foo.bar.bat.baz' se puede importar, hay que utilizar varias llamadas a find_module y load_module según el docs.
Cuestiones relacionadas