Wie wird jede Zeile eines Skripts gedruckt, da es nur für das Skript der obersten Ebene ausgeführt wird?

9

pythons Trace-Modul ermöglicht es Ihnen, ein Skript auszuführen, das jede Codezeile wie im Skript und allen importierten Modulen wie folgt ausgibt:

%Vor%

Gibt es eine Möglichkeit, dasselbe zu tun, aber nur druckt die Anrufe der obersten Ebene, d. h. nur die Zeilen in myscript.py , wenn sie ausgeführt werden?

Ich versuche, einen Fehler bei einem Abbruch von Traps zu beheben, und ich kann nicht herausfinden, wo er stirbt. Leider dauert die Verwendung des vollständigen --trace für immer - das Skript dauert normalerweise 2-3 Minuten und die vollständige Ablaufverfolgung dauert Stunden.

    
keflavich 12.08.2015, 12:04
quelle

5 Antworten

2

Ich bin auf dieses Problem gestoßen und fand, dass grep eine schnelle und schmutzige Lösung ist:

%Vor%

Mein Skript läuft jedoch in endlicher Zeit. Dies wird wahrscheinlich nicht für komplexere Skripte funktionieren.

    
rizard 19.04.2017 22:46
quelle
1

Vielleicht kann lptrace für Sie nützlich sein.

    
amirouche 08.11.2016 19:25
quelle
0

Es ist nicht genau das, was Sie wollen, aber Sie können py.test mit "-s" in Betracht ziehen, was verhindert, dass py.test die Ausgabe Ihrer Druckanweisung erfasst ... Sie können also hier und dort einige Druckanweisungen einfügen für jede Funktion, die Sie in Ihrem Skript haben und erstellen Sie einen Dummy-Test, die nur Ihr Skript wie gewohnt ausführen ... Sie können dann sehen, wo es fehlgeschlagen ist.

    
Richard 17.08.2015 16:11
quelle
0

Wenn Sie keine Rückverfolgung erhalten, können Sie die Technik halbierung verwenden.

Bearbeiten Sie Ihre Hauptfunktion oder den Skriptkörper und fügen Sie einen exit(1) -Aufruf ungefähr in der Mitte ein. Dies ist die erste Halbierung.

Führe dein Skript aus. Wenn es Ihren Ausgang erreicht, wissen Sie, dass der Fehler in der zweiten Hälfte ist. Wenn nicht, ist es in der ersten Hälfte.

Verschiebe exit auf die Hälfte der ersten Hälfte oder die Hälfte der zweiten Hälfte und versuche es erneut.

Mit jedem Zyklus können Sie die Position des Fehlers um die Hälfte des verbleibenden Codes verringern.

Wenn Sie es auf eine Ihrer eigenen Funktionen eingeschränkt haben, halbieren Sie das.

    
Roland Smith 17.08.2015 21:07
quelle
0

Sie können Dekorator verwenden und alle Funktionen Ihres Moduls dynamisch dekorieren (keine Bearbeitung jeder Funktion). Sie müssen diese Zeilen nur am Ende Ihres Skripts einfügen:

%Vor%     
Richard 20.08.2015 16:28
quelle

Tags und Links