Как импортировать два субмодуля в Python с одинаковым именем подпапки - PullRequest
0 голосов
/ 15 июня 2019

Структура моего проекта выглядит следующим образом:

project/
  main.py
  sub_a/
    class_a.py
    __init__.py
    utils/
      __init__.py
      util_a.py
  sub_b/
    class_b.py
    __init__.py
    utils/
      __init__.py
      util_b.py

И в каждом из class_a.py, class_b.py есть такой импорт:

from utils import util_a/b

My PYTHONPATH указывает на sub_a и sub_b. Когда я пытаюсь

import class_b

в main.py, я получаю ImportError:

ImportError: cannot import name util_b

Я использую Python 2.7.

Я понимаю, что ошибка возникает из-за неоднозначности from utils import util_b, поэтому Python выбирает первый путь, но как я могу переписать импорт, чтобы он работал?

Я не думаю, что изменение PYTHONPATH является вариантом, так как каждый из sub_a и sub_b предполагает, что они являются частью PYTHONPATH в своем собственном внутреннем импорте. Например, from utils import util_b в class_b.py.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Не добавляйте оба подкаталога в PYTHONPATH. Вместо этого добавьте к нему только project и импортируйте sub_a.utils.util_a и sub_b.utils.utils_b.
(В самих пакетах вы можете использовать относительный импорт , чтобы импортировать вещи из того же поддерева. Например, в sub_b/__init__.py: import .utils.utils_b)

В соответствии с isinstance завершается ошибкой для типа, импортируемого через пакет и из того же модуля напрямую , если вы добавляете подкаталоги, пакет utils связывается с тем, что раньше на sys.path, и только он будет искать, когда вы пытаетесь импортировать что-либо из utils.

0 голосов
/ 15 июня 2019

То, что вы ищете, это «Импортировать как»

Хороший обзор здесь: Ответ в другом потоке от ... импорт ИЛИ импорт ... как для модулей '

из project.sub_a import User as aUser

из project.sub_b import User as bUser

...