Module not found. Again?

Всем привет. У меня повторилась проблема описанная тут, только уже не в тестах. Module not found

Ситуация следующая есть папка D:\repositories\ED. Переменная PYTHONPATH имеет значение D:\repositories\ED. В ней есть папка elements в которой три файла: element.py, node.py и init.py Создано виртуальное окружение в папке .venv В итоге структура такая:\

ED:
    .venv
    elements:
        __init__.py
        element.py
        node.py

В файле elements.py определен класс Element В файле node.py определен класс Node, который наследуется от класса Element. При попытке импорта класса Element в node.py возникает ошибка module not found.

from elements.element import Element


class Node(Element):

    def __init__(
        self,
        is_base: bool = False,
        elements: Union[list, tuple, tensor] = None
    ) -> None:
        self.is_base = is_base
        self.elements = elements

Т.е. если попытаться создать объект класса Node, вот таким образом:

from elements.element import Element


class Node(Element):

    def __init__(
        self,
        is_base: bool = False,
        elements: Union[list, tuple, tensor] = None
    ) -> None:
        self.is_base = is_base
        self.elements = elements


node = Node(name='node', u_nom=220.0)

то получаем ошибку

(.venv) PS D:\repositories\ED> & d:/repositories/ED/.venv/Scripts/python.exe d:/repositories/ED/elements/node.py
Traceback (most recent call last):
  File "d:\repositories\ED\elements\node.py", line 7, in <module>
    from elements.element import Element
ModuleNotFoundError: No module named 'elements'

Складывается ощущение, что у меня есть какое то фундаментальное не понимание сути происходящего. Отчего возникает подобная ошибка? Отдельное спасибо если кинете ссылку на место где можно получить знания на эту тему. Спасибо.


Ответы (1 шт):

Автор решения: evYpe

Все, я кажется разобрался сам. Если мы работаем в разных модулях, но внутри одного пакета (т.е. внутри папки с init.py файлом) elements, то доступ к отдельным модулям пакета должен происходить напрямую без указания самого пакета. Т.е. импортируем класс из другого модуля так:

from module import class

Если же мы работаем внутри другой папки, то доступ к модулям пакета elements уже происходит так:

from package.module import class
→ Ссылка