#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()