Импорт Python сводит меня с ума (мой опыт с импортом Python иногда совсем не соответствует идиоме «Явный лучше, чем неявный» :():
[app]
start.py
from package1 import module1
[package1]
__init__.py
print('Init package1')
module1.py
print('Init package1.module1')
from . import module2
module2.py
print('Init package1.module2')
import sys, pprint
pprint.pprint(sys.modules)
from . import module1
Я получаю:
vic@ubuntu:~/Desktop/app2$ python3 start.py
Init package1
Init package1.module1
Init package1.module2
{'__main__': <module '__main__' from 'start.py'>,
...
'package1': <module 'package1' from '/home/vic/Desktop/app2/package1/__init__.py'>,
'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>,
'package1.module2': <module 'package1.module2' from '/home/vic/Desktop/app2/package1/module2.py'>,
...
Traceback (most recent call last):
File "start.py", line 3, in <module>
from package1 import module1
File "/home/vic/Desktop/app2/package1/module1.py", line 3, in <module>
from . import module2
File "/home/vic/Desktop/app2/package1/module2.py", line 5, in <module>
from . import module1
ImportError: cannot import name module1
vic@ubuntu:~/Desktop/app2$
import package1 .module1
работает, но я хочу использовать из. import module1
, потому что я хочу сделать package1
переносимым для других моих приложений, поэтому я хочу использовать относительные пути.
Я использую python 3.
Мне нужен циклический импорт. Функция в модуле 1 утверждает, что один из ее параметров является экземпляром класса, определенного в модуле 2, и наоборот.
Другими словами:
sys.modules
содержит 'package1.module1': <модуль 'package1.module1' из '/home/vic/Desktop/app2/package1/module1.py'>
. Я хочу получить ссылку е к нему в форме от. import module1
, но он пытается получить имя, а не пакет, как в случае import package1.module1
(который отлично работает). Я пробовал импортировать .module1 как m1
- но это синтаксическая ошибка.
Также из. import module2
в module1
работает нормально, но из. импортировать модуль1
в модуль2
не работает ...
ОБНОВЛЕНИЕ:
Этот хакер работает (но я ищу «официальный» способ):
print('Init package1.module2')
import sys, pprint
pprint.pprint(sys.modules)
#from . import module1
parent_module_name = __name__.rpartition('.')[0]
module1 = sys.modules[parent_module_name + '.module1']