Первая проблема, которую вы получите, связана с строкой from subpackage1 import a
в вашем модуле b.py
.
b.py
находится в вашем пакете subpackage2
, пакет с сестрой subpackage1
. Поэтому попытка запустить from subpackage1 import a
означает, что subpackage1
находится в пределах subpackage2
, что неверно. Также как примечание: в python3 вы никогда не должны использовать неявный относительный импорт, так как он больше не поддерживает его, поэтому вместо этого используйте явный относительный импорт.
Добавление __init__.py
в каждую папку превращает их в пакеты Python, и вы можете оставить их пустыми. Вы хотите заменить from subpackage1 import a
либо явным относительным импортом, таким как from ..subpackage1 import a
, либо абсолютным импортом, таким как from Project.subpackage1 import a
. Это будет эффективный и правильный способ написания вашего пакета, и вы можете проверить его, написав скрипт, который импортирует Project
и использует его подпакеты и модули.
Однако я предполагаю, что вы используете b.py
в качестве основного модуля для проверки импорта. Это означает, что вы запускаете командные строки, которые выглядят так: python b.py
. Запуск его таким образом дает вам путь поиска модуля, который не имеет ни одного из родительских путей, таких как Project
. Это может привести к тому, что вы продолжите получать ModuleNotFoundErrors, даже если с вашим пакетом нет технических проблем. Вот почему вам нужен обходной путь sys.path.append(...
, который вручную добавляет ваш родительский путь к пути поиска модуля, чтобы запустить ваш модуль b.py
в качестве основного модуля. Если это поможет вам протестировать ваш код, то обязательно используйте его, но хорошо использовать абсолютный и явный относительный импорт, потому что модули в пакете должны работать таким образом.