Problèmes d'importation relatifs dans Python 3

Python importations drive me crazy (mon expérience avec python importations parfois ne correspond pas du tout à l'original 'Explicite est mieux qu'implicite 🙁 ):

[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

J'obtiens:

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 fonctionne, mais je veux l'utiliser from . import module1 parce que je veux faire package1 portable pour mes autres applications, c'est pourquoi je veux utiliser des chemins relatifs.

Je suis à l'aide de python 3.

J'ai besoin circulaire importations. Une fonction dans module1 affirme que l'un de ses paramètre est instance d'une classe définie dans module2 et vice-versa.

En d'autres termes:

sys.modules contient 'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>. Je veux obtenir une référence dans le formulaire de from . import module1mais il essaie d'obtenir un nom, pas un paquet comme dans le cas import package1.module1 (qui fonctionne correctement). J'ai essayé import .module1 as m1 - mais c'est une erreur de syntaxe.

Aussi, from . import module2 dans module1 fonctionne très bien, mais from . import module1 dans module2 ne fonctionne pas...

Mise à JOUR:

Ce hack fonctionne (mais je suis à la recherche de la "officielle"):

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']

source d'informationauteur warvariuc