2009-08-03 13 views
58

Tengo un módulo que entra en conflicto con un módulo integrado. Por ejemplo, un módulo myapp.email definido en myapp/email.py.Intentar importar el módulo con el mismo nombre que un módulo integrado provoca un error de importación

Puedo hacer referencia myapp.email en cualquier parte de mi código sin problema. Sin embargo, necesito hacer referencia al módulo de correo electrónico integrado de mi módulo de correo electrónico.

# myapp/email.py 
from email import message_from_string 

Sólo se encuentra, y por lo tanto plantea una ImportError, ya myapp.email no tiene un método message_from_string. import email causa el mismo problema cuando intento email.message_from_string.

¿Hay algún soporte nativo para hacer esto en Python, o estoy atascado con el cambio de nombre de mi módulo de "correo electrónico" a algo más específico?

Respuesta

83

Querrá leer sobre Absolute and Relative Imports que soluciona este problema. Uso:

from __future__ import absolute_import 

Utilizando eso, cualquier nombre de paquete sin adornos siempre se referirá al paquete de nivel superior. Luego necesitará usar importaciones relativas (from .email import ...) para acceder a su propio paquete.

NOTA: Lo anterior from ... línea tiene que ser puesto en cualquier Python 2.x .py archivos por encima de las líneas import ... que estés utilizando. En Python 3.x este es el comportamiento predeterminado, por lo que ya no es necesario.

+1

Salvavidas ...... –

Cuestiones relacionadas