2015-08-17 15 views
28

Ich benutze ipdb ziemlich oft in einer Weise, nur zu einem Stück Code, der ist isoliert isoliert, d. H. Es ist schwer zu schreiben ein echtes Skript, das es verwendet. Stattdessen schreibe ich einen minimalen Testfall mit Spott und spring hinein.Beenden Python Debugger ipdb

Beispiele für den Workflow:

def func(): 
    ... 
    import ipdb 
    ipdb.set_trace() 
    ... 

def test_case(): 
    ... 
    func() 
    ... 

Dann rufen

py.test test_file.py -s -k test_case 

Jetzt, in der Regel nur eine Variable oder zwei, die ich überprüfen, und wollen dann beenden. Ändern Sie den Code und wiederholen Sie den Vorgang.

Wie kann ich aufhören? Das Handbuch sagt q beendet den Debugger. Es ist nicht (wirklich). Sie müssen einige Male beenden, bevor der Debugger tatsächlich beendet wird. Das gleiche Verhalten für Ctrl-C und Ctrl-D (mit der zusätzlichen Frustration, dass Ctrl-D mehrmals getroffen wird, beendet schließlich auch das Terminal).

Gibt es eine kluge Möglichkeit, den Abbruch zu erzwingen? Ist dieser Workflow überhaupt sinnvoll? Was ist der Standardweg?

+3

Ich bekomme das jetzt auch. Dies ist ein neues Verhalten. Früher war es gut, aber jetzt hört es einfach nicht auf. selbst wenn man eine Ausnahme wirft, wird es nicht aufhören. – felix

+2

Link zu [GitHub-Problem] (https://github.com/gotcha/ipdb/issues/111) zu diesem Problem. –

+0

Das ursprüngliche Problem wurde in ipython 5.2 gelöst, siehe @ cheflo's Antwort. Können Sie es als die Antwort akzeptieren, andere Leute nicht mit den vorgeschlagenen Problemumgehungen zu verwechseln? – ffeast

Antwort

33

Ich habe folgendes in meinem .pdbrc

import os 

alias kk os.system('kill -9 %d' % os.getpid()) 

kk tötet den Debugger und (den Prozess, den Debugger auslösen).

+1

Es würde funktionieren, aber es sieht eher nach einem Workaround aus als nach einer Lösung des Problems. Hast du versucht, ipdb Entwickler davon zu fragen? BTW sieht wie ein ähnliches Problem http: // stackoverflow aus.com/questions/39090752/how-to-quit-ipdb-während-in-post-mortem-debugging – ffeast

+0

Ja, ich stimme zu, es ist ein Workaround. Einer der Nachteile dieses Workarounds ist, dass, wenn Sie den Debugger von einer ipython-Konsole mit '% debug 'aufrufen und mein' kk'-Makro verwenden, wird nicht nur der Debugger beendet, sondern auch die ipython-Konsole beendet. Es sollte bei den Entwicklern angesprochen werden. – joachim

+0

Wo ist die .pdbrc Datei? Müssen Sie es erstellen, wenn es nicht bereits existiert? – RubberDuckRabbit

33

Das funktioniert für mich folgende:

import sys 
sys.exit() 

Bei neueren Versionen von ipython, wie oben und unten erwähnt, das funktioniert nicht. In diesem Fall

import os 
os._exit(0) 

tun soll, noch den Trick.

+1

Das funktioniert nicht für mich. Ich bekomme nur "*** SystemExit: -1" auf der Konsole und ich bin immer noch in ipdb. – velotron

+12

'os._exit (0)' arbeitete für mich. – akki

+0

Vielen Dank os.exit (0) –

7

Es ist das Problem mit der aktuellen Version von IPython 5.1.0. Sie können Ihre Umgebung mit dem folgenden Code überprüfen:

pip freeze | egrep -i '^i' 

Es gelöst werden, indem auf IPython == 5.0.0 herabgestuft.

pip install ipython==5.0.0 

Das funktioniert für mich.

4

Wie in einer anderen Antwort erwähnt, war dies ein Fehler in IPython 5.1. Es wurde behoben in this pull request und ist nicht mehr ein Problem von IPython 5.2 und höher. Sie können jetzt q, quit() oder Ctrl + d verwenden, um den Debugger zu beenden.

+0

Ich habe es gerade getestet und es funktioniert gut für mich. Ich denke, es sollte die akzeptierte Antwort sein, da ab ipython 5.2 die vorgeschlagenen Problemumgehungen keinen Sinn mehr machen – ffeast

+1

Nein. Dies funktioniert nicht, wenn Sie sich in einer Schleife befinden. –

+0

@ DarkStar1 Es funktioniert für mich in einer Schleife, können Sie eine Probe von, was nicht funktioniert? –

Verwandte Themen