Относительные проблемы импорта в Python 3

Импорт 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']
12
задан warvariuc 7 November 2011 в 08:34
поделиться