Я искал это в течение последних часов и не могу найти эквивалентный вопрос в любом месте. Также документация для 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, чтобы отличить мой вопрос от другого, называемого «Как сделать относительный импорт». Я думаю, что этот вопрос другой, потому что я спрашиваю конкретно о различиях между двумя версиями. Использование относительного импорта - это решение, а не вопрос.
Попробуйте использовать относительные пути, то есть 'импорта .subapi' – Marandil
Возможный дубликат [Как сделать относительно импорта в Python?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-import-in-python) –
Это абсолютно задокументировано, но я вижу, как документация может быть трудно найти/прочитать для новичков. –