Как импортировать модуль на том же уровне каталога?

#python

Вопрос:

Мой проект настроен следующим образом:

 /python-tools  - __init__.py  - /module_a  - __init__.py  - module_a.py  - /module_b  - __init__.py  - module_b.py  - /common  - __init__.py  - common.py  

Я пытаюсь импортировать common.common в module_a.py и module_b.py как это:

 from common.common import CommonClass  

Но я получаю ModuleNotFound ошибки. Я прочитал документацию, и, насколько я знаю, она должна быть правильно настроена в пакетах, чтобы эти модули можно было импортировать друг в друга.

Во многих ответах в Интернете рекомендуется изменять sys.path импорт, но мне это кажется абсурдным. Я довольно много работал на Python и помню, что мог импортировать модули без этих проблем.

Ответ №1:

Вам нужно использовать начальные точки ( .. ) при импорте, чтобы двигаться вверх в структуре каталогов.

Вот пример моей структуры:

 import_test/ ├── aspen/ │ └── aspen.py ├── birch/ │ ├── birch.py │ └── birch_leaf.py └── common/  └── common.py  

И вот содержимое файлов, обратите внимание , что использование двух ведущих точек перемещает один уровень каталога внутрь import_test , оттуда вы можете получить доступ к базовым модулям. Также обратите внимание, что вам не нужны __init__.py файлы.

aspen.py

 from ..common.common import CommonClass  class AspenClass(CommonClass):  def root(self):  print('pain in my aspen!')  

Здесь, в birch каталоге, мы можем импортировать из родственного файла, используя только одну точку в инструкции импорта, как birch_leaf.py показано ниже

birch.py

 from ..common.common import CommonClass  class BirchClass(CommonClass):  def root(self):  print('birch, please!')  

birch_leaf.py

 from .birch import BirchClass  class BirchLeafClass(BirchClass):  def fall(self):  print('i am falling!')  

common.py

 class CommonClass:  def __init__(self):  self.val = None  

Этот набор модулей импортируется и запускается с использованием:

 from import_test.aspen import aspen from import_test.birch import birch_leaf  aspen.AspenClass() birch_leaf.BirchLeafClass()