При попытке импортировать модуль с тем же именем, что и встроенный модуль, возникает ошибка импорта
У меня есть модуль, который конфликтует со встроенным модулем. Например, модуль 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, или я застрял в переименовании моего модуля "электронной почты" на что-то более конкретное?
Ответы
Ответ 1
Вы хотите прочитать о Абсолютный и относительный импорт, который решает эту проблему. Использование:
from __future__ import absolute_import
Используя это, любое неприкрашенное имя пакета всегда будет ссылаться на пакет верхнего уровня. Затем вам потребуется использовать относительный импорт (from .email import ...
) для доступа к вашему собственному пакету.
ПРИМЕЧАНИЕ.. Вышеупомянутая строка from ...
должна быть помещена в любые файлы 2.x Python .py
над линиями import ...
, которые вы используете. В Python 3.x это поведение по умолчанию и поэтому больше не требуется.