Попытка импортировать модуль с тем же именем, что и встроенный модуль, вызывает ошибку импорта - PullRequest
67 голосов
/ 04 августа 2009

У меня есть модуль, который конфликтует со встроенным модулем. Например, модуль myapp.email, определенный в myapp/email.py.

Я могу ссылаться на myapp.email в любом месте моего кода без проблем. Однако мне нужно сослаться на встроенный модуль электронной почты из моего модуля электронной почты.

# myapp/email.py
from email import message_from_string

Он только находит себя и, следовательно, вызывает ImportError, поскольку myapp.email не имеет message_from_string метода. import email вызывает ту же проблему при попытке email.message_from_string.

Есть ли какая-либо встроенная поддержка для этого в Python или я застрял с переименованием моего модуля "email" во что-то более конкретное?

1 Ответ

93 голосов
/ 04 августа 2009

Вы захотите прочитать о Абсолютном и относительном импорте , который решает эту проблему. Использование:

from __future__ import absolute_import

Используя это, любое неукрашенное имя пакета всегда будет ссылаться на пакет верхнего уровня. Затем вам нужно будет использовать относительный импорт (from .email import ...) для доступа к вашему собственному пакету.

ПРИМЕЧАНИЕ: Указанную выше строку from ... необходимо поместить в любые файлы 2.x Python .py выше используемых вами строк import .... В Python 3.x это поведение по умолчанию, поэтому оно больше не требуется.

...