Абсолютный импорт, например import x.y.z
или from x.y import z
, требует x
, чтобы быть на вашем пути.В вашем конкретном случае myModel
находится на пути из-за вашего рабочего каталога.Подпакеты не находятся на пути, и поэтому могут быть доступны только путем повторения корневого пакета.
Более интуитивным подходом может быть использование относительных путей.Это возможно, потому что все ваши файлы живут в правильных пакетах с __init__
файлами.Имейте в виду, что относительные пути подразумевают, что у вас есть модули, которые предназначены для использования в структуре вашего пакета, а не сами по себе.В противном случае вы можете столкнуться с ошибками при попытке запуска некоторых модулей в виде автономных сценариев.
Измените myModel/__init__.py
на:
from . import models
from . import loader
.
делает импорт относительным,Обратите внимание, что я не предлагал изменять main.py
, поскольку он находится за пределами ваших пакетов.Добавление дополнительных точек позволяет повысить уровень иерархии файлов.
Измените myModel/loader/__init__.py
на
from .dataset_loader import *
и myModel/models/__init__.py
на
from .static_model import StaticModel
An import
оператор связывает имя в вашем локальном пространстве имен (обычно это модуль, в котором вы его выполняете).Имя, которое будет связано, зависит от того, какую форму import
вы использовали:
import x
связывает модуль, описанный в x.py
или x/__init__.py
, с именем x
import x.y
связывает модуль, описанный в x.py
или x/__init__.py
, с именем x
и гарантирует, что x
имеет атрибут y
, либо как атрибут, определенный в x.py
/ __init__.py
или как субмодуль в x/y.py
. from x import y
связывает атрибут или субмодуль y
из x.py
/ x/__init__.py
или x/y.py
с именем y
.Эта опция загружается, но не дает вам доступа к x
.
Когда вы запускаете from myModel import loader
, вы получаете объект модуля loader
, который имеет атрибут callable fun
.