2015-02-09 8 views
6

diesen Beispielcode Gegeben:Wie geht man mit der nächsten Schleifeniteration in Python PDB weiter?

import pdb 

for i in range(10): 
    pdb.set_trace() 
    print(str(i)) 

Wenn ich die Eingabeaufforderung aus dem HVE bekommen, wie kann ich eine Iteration der Schleife überspringen, mit der Schleifensteueranweisung weiter, wenn es auch von PDB verwendet wird, um fortzufahren Codeausführung?

+0

Also, um klar zu sein, möchten Sie den Code so verhalten, als ob eine 'continue'-Anweisung ausgeführt wurde? Du willst nicht, dass 'str (i) 'für diese Schleife gedruckt wird, oder? – Kevin

+0

Das stimmt! – Andor

+1

Übrigens, für das allgemeine Problem "Wie unterscheide ich zwischen pdb-Befehlen und Python-Ausdrücken, die nur wie pdb-Befehle aussehen?" Können Sie Ihrem Python-Ausdruck ein Ausrufezeichen voranstellen. Dies scheint jedoch nicht speziell für 'continue' zu ​​funktionieren. – Kevin

Antwort

7

Klingt wie eine seltsame Sache zu tun. Sie sollten jedoch die jump command verwenden können. Wahrscheinlich müssen Sie am Ende Ihrer for-Schleife eine pass-Anweisung hinzufügen, damit Sie zum Ende der Schleife springen können. Wenn Sie sich über die Zeilennummern Ihres Codes nicht sicher sind, können Sie ll verwenden, um die Zeilennummern Ihrer Schleife zu ermitteln.

> c:\run.py(5)<module>() 
-> print(i) 
(Pdb) ll 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(i) 
    6   pass 
(Pdb) j 6 
> c:\run.py(6)<module>() 
-> pass 
(Pdb) c 
> c:\python\run.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) c 
1 
> c:\python\run.py(5)<module>() 
-> print(i) 

Es ist erwähnenswert, dass die Schleife an die for Linie springen wird neu gestartet.

+0

Das ist eine Lösung. Vielen Dank! Wenn jedoch jemand eine Lösung kennt, um eine * continue * -Anweisung in dem Kontext auszuführen, wäre es sogar noch besser. – Andor

8

Sie können continue nicht verwenden, da neue Anweisungen im Debugger complete und ohne anderen Kontext gültig sein müssen; continue muss in einem Loop-Konstrukt bei der Erstellung gegeben werden. Daher kann !continue (mit der !, um pdb von der Interpretation des Befehls zu verhindern) nicht verwendet werden, auch wenn der Debugger ein Schleifenkonstrukt verarbeitet.

Sie können den j[ump] Befehl, vorausgesetzt, Sie haben eine später Anweisung zu springen. Wenn Ihre Schleife leer ist, nachdem die Anweisungen, die Sie wollte überspringen, können Sie nur ‚zurückspulen‘:

$ bin/python test.py 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) l 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(str(i)) 
    6  
[EOF] 
(Pdb) j 3 
> /.../test.py(3)<module>() 
-> for i in range(10): 

j 3 sprang 3 Zeile, nichts Skipping; Zeile 3 wird erneut ausgeführt, einschließlich der Einrichtung der range(). Sie könnten zu Zeile 4 springen, aber dann wird die for Schleife nicht weitergeschaltet.

Sie müssten am Ende der Schleife eine weitere Anweisung hinzufügen, um zu Python zu springen, um von dort fortzufahren. Diese Aussage kann ein print() oder ein pass oder irgendetwas anderes sein, das Ihren Zustand nicht ändern muss. Sie könnten sogar continue als letzte Anweisung verwenden. Früher habe ich i:

for i in range(10): 
    pdb.set_trace() 
    print(str(i)) 
    i # only here to jump to. 

Demo:

$ bin/python test.py 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) l 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(str(i)) 
    6   i # only here to jump to. 
    7  
[EOF] 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) c 
> /.../test.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) s 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) i 
1 
(Pdb) c 
> /.../test.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) s 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) i 
2 

Von Debugger Commands:

j (UMP) lineno
die nächste Zeile einstellen, die ausgeführt wird. Nur im untersten Rahmen verfügbar. Auf diese Weise können Sie zurückspringen und Code erneut ausführen oder vorwärts springen, um Code zu überspringen, den Sie nicht ausführen möchten.

Es ist zu beachten, dass nicht alle Sprünge erlaubt sind - zum Beispiel ist es nicht möglich, in die Mitte einer for Schleife oder aus einer finally Klausel zu springen.

Verwandte Themen