Импорт 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
Я получаю:
[email protected]:~/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
[email protected]:~/Desktop/app2$
import package1.module1
работает, но я хочу использовать from . import module1
, потому что хочу сделать package1
переносимым для других приложений, поэтому я хочу использовать относительные пути.
Я использую python 3.
Мне нужен круговой импорт. Функция в модуле 1 утверждает, что один из ее параметров является экземпляром класса, определенного в модуле 2 и наоборот.
Другими словами:
sys.modules
содержит 'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>
. Я хочу получить ссылку на него в форме from . import module1
, но он пытается получить имя, а не пакет, например, в случае import package1.module1
(который отлично работает). Я пробовал import .module1 as m1
- но это синтаксическая ошибка.
Кроме того, from . import module2
в module1
работает отлично, но from . import module1
в module2
не работает...
UPDATE:
Этот хак работает (но я ищу "официальный" способ):
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']