Fallo de importación absoluta en el subpaquete que oculta un nombre de paquete estándar

Básicamente, tengo un subpaquete con el mismo nombre que un paquete de biblioteca estándar (“registro”) y me gustaría poder importar de forma absoluta el estándar, no importa cómo lo ejecute, pero esto falla cuando estoy en el paquete padre

Realmente parece un error o un comportamiento no documentado del nuevo soporte de “importación absoluta” (nuevo a partir de Python 2.5). Probado con 2.5 y 2.6.

Diseño del paquete:

foo/ __init__.py logging/ __init__.py 

En foo/__init__.py importamos nuestro propio subpaquete de registro:

 from __future__ import absolute_import from . import logging as rel_logging print 'top, relative:', rel_logging 

En foo/logging/__init__.py queremos importar el paquete de logging stdlib:

 from __future__ import absolute_import print 'sub, name:', __name__ import logging as abs_logging print 'sub, absolute:', abs_logging 

Nota: La carpeta que contiene foo está en sys.path.


Cuando se importa desde fuera / por encima de foo , la salida es la esperada:

 c:\> python -c "import foo" sub, name: foo.logging sub, absolute:  top, relative:  

Así que la importación absoluta en el subpaquete encuentra el paquete stdlib como se desea.

Pero cuando estamos dentro de la carpeta foo , se comporta de manera diferente:

 c:\foo>\python25\python -c "import foo" sub, name: foo.logging sub, name: logging sub, absolute:  sub, absolute:  top, relative:  

La salida doble para “sub, nombre” muestra que mi propio subpaquete llamado “registro” se está importando una segunda vez, y no encuentra el paquete de “registro” stdlib aunque “absoluto_import” esté habilitado .

El caso de uso es que me gustaría poder trabajar con, probar, etc., este paquete, independientemente de cuál sea el directorio actual. Cambiar el nombre de “registro” a otra cosa sería una solución alternativa, pero no deseable, y en cualquier caso, este comportamiento no parece coincidir con la descripción de cómo deberían funcionar las importaciones absolutas.

¿Alguna idea de lo que está sucediendo, si se trata de un error (mío o de Python’s), o si este comportamiento está de hecho implícito en la documentación?

Edición: la respuesta de gahooa muestra claramente cuál es el problema. Una solución cruda que demuestra que se muestra aquí:

 c:\foo>python -c "import sys; del sys.path[0]; import foo" sub, name: foo.logging sub, absolute:  top, relative:  

sys.path[0] es por defecto '' , que significa “directorio actual”. Por lo tanto, si está sentado en un directorio con el logging de logging , se elegirá primero.

Me encontré con esto recientemente, hasta que me di cuenta de que en realidad estaba sentado en ese directorio y que sys.path estaba recogiendo mi directorio actual PRIMERO, antes de buscar en la biblioteca estándar.