tutorial memoryerror python exception-handling importerror

memoryerror - Capture python ''ImportError'' si importa desde el directorio de origen



django tutorial (1)

Cuando uno intenta importar un módulo foo mientras está en el directorio de origen, recibe un mensaje ImportError bastante confuso: ImportError: No module named foo .

¿Cómo puedo detectar fácilmente este caso y devolver un mensaje más informativo, por ejemplo, ''No cargue el módulo foo desde el directorio de origen''?

Teniendo el __init__.py , empezaría con:

try: from _foo import * except ImportError: ## check whether in the source directory...

Por lo tanto, me gustaría distinguir las diferentes causas de ImportError (por ejemplo, porque un módulo llamado foo no está instalado) y detectar el caso en que setup.py se encuentra en el directorio actual. ¿Cuál sería una forma elegante de hacer esto?


ImportError: No module named foo significa que el módulo foo.py o el paquete foo/__init__.py no se pudieron encontrar en ninguno de los directorios en la ruta de búsqueda (lista sys.path ).

Desde sys.path suele contener . (el directorio actual), eso es probablemente lo que quiso decir al estar en el directorio de origen . Se encuentra en el directorio de nivel superior del paquete foo (donde se encuentra el archivo __init__.py ), así que obviamente no puede encontrar foo/__init__.py .

Finalmente, has respondido tu propia pregunta, más o menos:

try: from _foo import * except ImportError: raise ImportError(''<any message you want here>'')

Alternativamente, puede verificar el contenido de sys.path , el directorio actual y, si se conoce, el directorio del paquete esperado y generar un mensaje incluso detallado y sensible al contexto.

O agregue .. a la variable de entorno PYTHONPATH (en Unix) para permitirle ejecutar desde su directorio de origen. Incluso podría funcionar en Windows, pero no lo sabría.