Это общая проблема с системой импорта python, но одним из способов сделать ее более управляемой может быть определение некоторых импортов в другом __init__.py
в корневом каталоге ваших проектов, что создаст отдельное пространство имен для вашего пакета и всех остальных.подкаталоги.
Способ установки каталогов для воспроизведения вашей ошибки заключается в следующем:
Корневой каталог: /package
:
/package
/package/__init__.py
/package/a
/package/a/__init__.py
/package/a/b
/package/a/b/__init__.py
/package/a/b/module1.py
/package/c
/package/c/__init__.py
/package/c/module2.py
В package/__init__.py
введитемодуль верхнего уровня импортирует:
from a.b import module1
и затем единственное изменение, которое я сделал, - module2.py
, чтобы содержать только эту функцию для тестирования:
from package import a # import top-level module from root package
def func():
a.b.module1.some_object() # call function of module1 from module2 (this module).
if __name__ == '__main__':
func()
, затем на верхнем уровнекорень пакета, из терминала вы сможете запустить module2.py
:
$ python package/c/module2.py
должен распечатать:
from a.b.module1: some object
Для точного поведения могут быть сделаны улучшения и уточненияВы хотите.
Для справки, я использовал предложения этого ответа: Как избежать циклического импорта в Python?