Re: Re: Comprobar si un módulo existe antes de cargarlo

Chema Cortes pych3m4 en gmail.com
Vie Abr 13 11:43:57 CEST 2007


El 12/04/07, Gabriel Genellina <gagsl-py2 en yahoo.com.ar> escribió:

> Dependiendo de los motivos para preguntar primero si existe, find_module y
> sus variantes pueden servir o no.
> Qué pasa si el .py del modulo existe, pero tiene errores de sintaxis?
> O si existe pero a su vez depende de otro modulo que no existe?
> O si ...?
> Nada de eso se puede detectar sin intentar cargar efectivamente el modulo.
> Y eso va de la mano de la filosofia imperante en Python: "Es más fácil
> pedir perdón que permiso". Asi que lo mejor es importarlo realmente,
> atrapar la posible excepcion ImportError y actuar en consecuencia.
>
> Esto es, si uno quiere realmente usarlo, o si hay varias alternativas y se
> esta buscando cual es la que esta realmente disponible (ejemplo:
> getpass.py). Si fuera para mostrar el nombre en una lista, o para saber de
> dónde lo cargaría antes de importarlo, sí tienen sentido find_module&cía.

También se podría dar el razonamiento contrario: para chequear si está
instalado un paquete no parece lógico tener que "importar" todos y
cada uno de los módulos que lo componen (por ejemplo, wxPython tendría
264 módulos para importar).

Por si a alguien le sirve, aquí dejo una versión para buscar módulos
sin tener que importarlos. Emplea patrones de búsqueda insensibles a
mayúsculas/minúsculas (es fácil cambiar este comportamiento):

import pydoc
import re

def FindModules(pattern):
    pat=re.compile(pattern,re.IGNORECASE)
    results=[]

    def callback(p,n,d):
        if n.endswith(".__init__"):
            n=n[-9:]
        if pat.search(n):
            results.append( (n, p) )

    pydoc.ModuleScanner().run(callback)

    return results


Para ver todos los módulos del paquete wx:

print [ m for (m,p) in FindModules("^wx") ]




Más información sobre la lista de distribución Python-es