Подтвердить что ты не робот

При попытке импортировать модуль с тем же именем, что и встроенный модуль, возникает ошибка импорта

У меня есть модуль, который конфликтует со встроенным модулем. Например, модуль 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, или я застрял в переименовании моего модуля "электронной почты" на что-то более конкретное?

4b9b3361

Ответ 1

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

from __future__ import absolute_import

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

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