2016-11-10 2 views
0

Ich habe ein Problem mit dem Debugger, wenn einige Module in meinem Code einander aufrufen. Praxisbeispiel:Python Spyder Debug friert mit zirkulären Import ein

Eine Datei dog.py enthält den folgenden Code:

import cat 
print("Dog") 

Die Datei cat.py ist folgende:

import dog 
print("Cat") 

Wenn ich dog.py laufen (oder Katze .py) Ich habe kein Problem und das Programm läuft reibungslos. Wenn ich jedoch versuche, es zu debuggen, friert der ganze Spyder ein und ich muss das Programm beenden.

Wissen Sie, wie kann ich das beheben? Ich möchte diesen zirkulären Import verwenden, da die Module Funktionen verwenden, die sich in den anderen Modulen befinden.

Vielen Dank!

Antwort

2

Wenn ich dog.py (oder cat.py) starte, habe ich kein Problem und das Programm läuft reibungslos.

AFAICT, die vor allem weil ein Skript unter dem besonderen Namen importiert wird ("__main__"), während ein Modul unter seinen eigenen Namen importiert wird (hier „Hund“ oder „Katze“). NB: Der einzige Unterschied zwischen einem Skript und einem Modul ist tatsächlich geladen - hat ein Argument an die Python-Laufzeit übergeben (python dog.py) oder aus einem Skript oder einem Modul mit einer import-Anweisung importiert.

(Eigentlich Kreis Importe Fragen sind ein wenig komplizierter als das, was ich oben beschrieben, aber ich werde dies mehr Wissen zu jemand verlassen.)

Um eine lange Geschichte kurz zu machen: außer für diese besondere Verwendung Fall (das ist eigentlich eher eine Nebenwirkung), Python tut nicht Unterstützung kreisförmige Importe. Wenn Sie Funktionen (Klassen, was auch immer) haben, die von anderen Skripten oder Modulen gemeinsam genutzt werden, stellen Sie diese Funktionen in ein anderes Modul. Oder wenn Sie herausfinden, dass zwei Module wirklich voneinander abhängen, können Sie sie nur in ein einzelnes Modul umgruppieren (oder die Teile neu gruppieren, die voneinander in einem Modul und allem anderen in einem oder mehreren anderen Modulen abhängen).

Außerdem: es sei denn, es ist ein trivial One-Shot-Dienstprogramm oder etwas, das nur von der Stdlib abhängt, ist der Inhalt des Skripts oft auf eine main Funktion Parsen Befehlszeilenargumente/Lesen von Konfigurationsdateien/was auch immer, die erforderlichen Module zu importieren und den effektiven Prozess starten.

+0

Dank bruno. Aber wie kommt es, dass das Skript nicht nur beim Debuggen funktioniert? Was ist der Unterschied? – riccio777

+0

@ riccio777 Ich benutze Spyder nicht, also kann ich nicht wirklich sagen, aber ich denke, es versucht, Ihre Module für die Inspektion zu importieren (unter seinem richtigen Modulnamen) und schief geht versucht, den zirkulären Import zu behandeln. –