Was soll Python auch groß anders sagen? "Hilfe, du hast einen zirkulären Import!"? Aus Sicht von Python kann eben der Name nicht gefunden werden und nichts anderes. Und woran es liegt, wird, wenn man Python kennt, auch recht schnell klar, denn das schöne an Python ist ja, dass man für Ausnahmen Tracebacks für umsonst bekommt und nicht erst einen Debugger oder sonst etwas anwerfen muss.
Nehmen wir also an, ich habe ein Modul `main`, das `a` importiert. `a` hat irgendwas an den Namen `A` gebunden. Zuvor importiert `a` jedoch das Modul `b` und `b` importiert wiederum aus `A` aus `a`. Also:
Code: Alles auswählen
# main
import a
#a
import b
A = 42
# b
from a import A
Wenn man das jetzt ausführt, wird eine Ausnahme geworfen und man erhält einen Traceback.
Code: Alles auswählen
Traceback (most recent call last):
File "main.py", line 1, in <module>
import a
File "a.py", line 1, in <module>
import b
File "b.py", line 1, in <module>
from a import A
ImportError: cannot import name A
Also schaut man sich an, was passiert. Wenn man in `main` anfängt, sieht man, dass `a` importiert wird. Also macht man sich klar, was das bedeutet. Das Modul wird gesucht, geparst usw., dann wird ein Modulobjekt in `sys.modules` gesteckt und dann wird einfach der Code im Modul ausgeführt, der dann von oben nach unten abläuft. Danach sieht man, dass eben der Code in `a` wiederum `b` importiert. Der Ablauf ist analog zu `a`. Und dann sieht man, dass in `b` eben wieder `a` importiert wird. Was passiert jetzt aber hier? Module werden in Python gecachet, weshalb `a` nicht noch einmal neu geladen wird, sondern es wird das Modulobjekt aus `sys.modules` verwendet. Da der Code im Modul jedoch von oben nach unten ausgeführt wird, `A` in `a` also erst nach der Importanweisung erstellt wird, kann `A` eben nicht importiert werden. Würde man jetzt beispielsweise das Modul `a` so ändern:
würde keine Ausnahme geworfen werden.
Von daher ist ein zirkulärer Import IMHO also nicht unbedingt schwer zu debuggen (immerhin ist er völlig offensichtlich im Traceback zu erkennen), sondern kann eher auf Grund fehlender Kenntnisse über den Importmechanismus nicht erklärt werden.