2009-08-03 9 views
58

Mam moduł, który jest w konflikcie z wbudowanym modułem. Na przykład moduł myapp.email zdefiniowany w myapp/email.py.Próba importu modułu o tej samej nazwie co wbudowany moduł powoduje błąd importu.

Mogę odwołać się do myapp.email w dowolnym miejscu mojego kodu bez problemu. Muszę jednak odwołać się do wbudowanego modułu poczty e-mail z mojego modułu poczty e-mail.

# myapp/email.py 
from email import message_from_string 

To tylko stwierdzi się, a tym samym podnosi ImportError, ponieważ myapp.email nie ma metody message_from_string. import email powoduje ten sam problem podczas próby email.message_from_string.

Czy jest jakieś natywne wsparcie w tym celu w Pythonie, czy też utknąłem z przemianowaniem mojego modułu "e-mail" na coś bardziej konkretnego?

Odpowiedz

83

Będziesz chciał przeczytać o Absolute and Relative Imports, który rozwiązuje ten problem. Zastosowanie:

from __future__ import absolute_import 

Korzystanie że każdy ozdób nazwa pakietu będzie zawsze odnosić się do górnego poziomu pakietu. Będziesz wtedy musiał użyć importu względnego (from .email import ...), aby uzyskać dostęp do własnego pakietu.

UWAGA: Powyższy from ... linia musi być umieszczone w dowolnym języku Python 2.x .py plików powyżej import ... linii jesteś korzystających. W Pythonie 3.x jest to domyślne zachowanie, więc nie jest już potrzebne.

+1

Lifesaver ...... –