Модуль импорта Python из одноуровневой папки

Я прошел через множество вопросов по относительному импорту Python, но не могу понять проблему / заставить ее работать...

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

Driver.py

A/
      Account.py
      __init__.py

B/
      Test.py
      __init__.py

====================

Driver.py

from B import Test

=========

Account.py

class Account:
def __init__(self):
    self.money = 0

====================

Test.py

from ..A import Account

==================

Когда я пытаюсь бежать

python Driver.py

Я получаю ошибку

Traceback (последний вызов был последним):

из B импорт тест

Файл "B/Test.py", строка 1, в <module> из..А учетной записи импорта

ValueError: Попытка относительного импорта за пределы пакета верхнего уровня

3 ответа

Решение

Это происходит потому, что A а также B являются независимыми, несвязанными, пакетами для Python.

Создать __init__.py в том же каталоге, что и Driver.py и все должно работать как положено.

В моем случае добавление __init__.pyбыло недостаточно. Вам также необходимо добавить путь к родительскому каталогу, если вы получите ошибку «модуль не найден».

      root :
 |
 |__SiblingA:
 |    \__A.py
 |     
 |__SiblingB:
 |      \_ __init__.py
 |      \__B.py
 |

Чтобы импортировать B.py из A.py, вам необходимо сделать следующее

      import sys
  
# append the path of the parent directory
sys.path.append("..")

from SiblingB import B
print("B is successfully imported!")

Причина для

      ValueError: Attempted relative import beyond toplevel package

это тот же уровень каталога, что и . Следовательно, ..Aв from ..A import Accountвыходит за рамки пакета верхнего уровня.

Вы можете решить эту проблему, создав новую папку с именем вместе с __init__pyв эту новую папку, а затем переместите Aа также Bпапки в AandBпапка. Структура каталогов выглядит следующим образом:

Соответственно, содержание в Driver.pyследует изменить как from AandB.B import Test.

Другие вопросы по тегам