Импорт модулей Python - Явный и неявный относительный импорт

Вчера вечером, когда я работал над своим mac, я установил некоторые модули импорта в __init__.py

from MongoProvider import MongoProvider
from Settings import Settings

и т.д.. Я не уверен, какая версия Python находится на этой машине. После этого я отредактирую вопрос позже с этой информацией.

Сегодня, работая на другой машине, которая является Windows и использует Python 3.3.3, мои модули импортируются. Добавив явный относительный импорт (добавив ведущую точку), я смог исправить эту проблему.

from .MongoProvider import MongoProvider
from .Settings import Settings

Я получаю следующую трассировку:

Traceback (most recent call last):
File "app.py", line 5, in <module> from modules.route_handlers import Route_Handlers
File "C:\Users\willb\bearded-dubstep\modules\route_handlers\Route_Handlers.py", line 9, in <module> from modules.backend_providers import Settings
File "C:\Users\willb\bearded-dubstep\modules\backend_providers\__init__.py", line 1, in <module> from MongoProvider import MongoProvider
ImportError: No module named 'MongoProvider'

Мой макет проекта

root
| _modules
  | _api_helpers
      __ init__.py
      InvalidUsage.py
      response_utils.py
  | _backend_providers
      __ init__.py
      MongoProvider.py
        Settings.py
  | _route_handlers
      __ init__.py
      Route_Handlers
|   app.py

Любые идеи, что может вызвать это? Есть ли файл конфигурации, на который я должен смотреть?

Ответ 1

Хорошо, согласно PEP-8 импортирует раздел:

Неявный относительный импорт никогда не должен использоваться и был удален в Python 3.

Поскольку Python 3.3 является причиной, вызывающей у вас проблемы, делая явные модули импортированных импортов, я предполагаю, что это объясняет ситуацию. Вероятно, на Mac у вас есть Python 2.x, поэтому он работает там.

Посмотрев на распределение файлов проекта, Settings.py и MongoProvider действительно являются относительными модулями. Это означает, что удаление неявного относительного импорта в Python 3 является причиной, вызывающей у вас проблемы, поскольку система импорта не может найти модуль:

ImportError: No module named 'MongoProvider'

Ответ 2

Кажется, что версия Python на вашем Mac равна 2.x, а Python на ваших окнах - 3.x.

Я столкнулся с той же проблемой перед использованием модуля tkinter (который является Tkinter в Python 2.x).

Кажется, что нам нужно использовать из XXX.xxx import xxx для импорта... ● ﹏ ●

Я не знаю, почему, может быть, дизайнер настраивается на Python.