2017-02-02 3 views
2

Я искал это в течение последних часов и не могу найти эквивалентный вопрос в любом месте. Также документация для 2.7 и 3.5 кажется идентичной, поэтому я не думаю, что это поведение документировано.Python 3.5 vs Python 2.7: Модули, импортирующие подмодули

Вот моя структура каталогов:

project 
    -- project.py 
    -- api 
     -- __init__.py 
     -- subapi 
      -- __init__.py 

содержание project/project.py: import api

содержимое project/api/__init__.py: import subapi

Если я выполнить python project.py (с помощью Python 2.7) из внутри папки проектов, он возвращается без ошибок. Если бы я сделать то же самое с питоном 3 (python3 project.py), то он падает с

Traceback (most recent call last): 
    File "project.py", line 1, in <module> 
    import api 
    File "/home/me/Documents/project/api/__init__.py", line 1, in <module> 
    import subapi 
ImportError: No module named 'subapi' 

Если я перепишу оператор импорта использовать пути относительно директорию проекта (import api.subapi), то она работает с Python 2, а также 3. Это не удовлетворительное решение, хотя из-за того, что для этого требуется, чтобы я ссылался на родительские модули изнутри модулей, которые видят в себе модульность.

У кого-нибудь есть идея, что я могу сделать, чтобы вернуть поведение python2 обратно ? Алгоритм поиска модуля должен приоритезировать поиск в локальном каталоге файла с помощью оператора import. Кстати, это должно также приоритезировать эти файлы выше встроенных модулей. Попробуйте импортировать модуль 'test'.

--EDIT-- Меня попросил stackoverflow, чтобы отличить мой вопрос от другого, называемого «Как сделать относительный импорт». Я думаю, что этот вопрос другой, потому что я спрашиваю конкретно о различиях между двумя версиями. Использование относительного импорта - это решение, а не вопрос.

+2

Попробуйте использовать относительные пути, то есть 'импорта .subapi' – Marandil

+0

Возможный дубликат [Как сделать относительно импорта в Python?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-import-in-python) –

+0

Это абсолютно задокументировано, но я вижу, как документация может быть трудно найти/прочитать для новичков. –

ответ

3

Используйте явный относительный импорт:

from . import subapi 
+0

работает! Я все еще смущен, почему они решили изменить поведение импорта в python 3. Может быть, они хотят заставить людей использовать иерархию плоских модулей (в отличие от nodejs). – Phil

+0

@Phil: См. [PEP 328] (https: //www.python. орг/DEV/Peps/PEP-0328 /). – user2357112

+0

@Phil. Точно нет. На самом деле им было проще писать вложенные библиотеки. –

Смежные вопросы