2009-07-14 7 views

Antwort

104

Es ist ein Projekt, das ipdb ipython in den Standard-PDB-bettet, so können Sie einfach tun:

import ipdb; ipdb.set_trace() 

Es ist installierbar über die üblichen pip install ipdb.

ipdb ist ziemlich kurz, so dass statt easy_installing Sie auch einen Dateipfad ipdb.py irgendwo auf Ihrem Python erstellen und die folgenden in die Datei einfügen:

import sys 
from IPython.Debugger import Pdb 
from IPython.Shell import IPShell 
from IPython import ipapi 

shell = IPShell(argv=['']) 

def set_trace(): 
    ip = ipapi.get() 
    def_colors = ip.options.colors 
    Pdb(def_colors).set_trace(sys._getframe().f_back) 
+2

Super! Das ist so cool! – Geo

+0

Funktioniert erstaunlich gut mit Django. Nun, außer dass ich den Text, den ich tippe, nicht sehen kann, aber das ist wahrscheinlich leicht zu reparieren (da ipdb nur sechs Zeilen hat). –

+4

Eigentlich gibt es das Problem, dass Django einen separaten Thread für den Runserver gibt und jedes Mal, wenn Sie einen Code bearbeiten, wird der Thread erneut angezeigt. Dies funktioniert normalerweise gut, aber wenn Sie in pdb sitzen, wenn der Thread getötet wird, wird das Terminal verrückt. Sie können dies beheben, indem Sie runserver, runniny 'stty sane' ausbrechen und dann runserver erneut starten. –

8

Normalerweise, wenn ich ipython verwende, schalte ich das automatische Debugging mit dem Befehl "pdb" ein.

Ich führe dann mein Skript mit dem Befehl "run myscript.py" in dem Verzeichnis, in dem sich mein Skript befindet.

Wenn ich eine Ausnahme bekomme, stoppt Ipython das Programm im Debugger. Überprüfen Sie den Befehl help für die Magie aus IPython Befehle (% Magie)

+0

so gibt es keine Möglichkeit, etwas wie ipython.set_trace des Schreibens()? :) – Geo

3

Vom IPython docs:

import IPython.ipapi 
namespace = dict(
    kissa = 15, 
    koira = 16) 
IPython.ipapi.launch_new_instance(namespace) 

wird programmatisch eine IPython Shell starten. Offensichtlich sind die Werte im namespace dict nur Dummy-Werte - es könnte sinnvoller sein, locals() in der Praxis zu verwenden.

Beachten Sie, dass Sie dies hart einprogrammieren müssen; es funktioniert nicht so wie pdb. Wenn es das ist, was Sie wollen, ist die Antwort von DoxaLogos wahrscheinlich eher das, wonach Sie suchen.

11

Die äquivalent

import pdb; pdb.set_trace() 

mit IPython ist etwas wie:

from IPython.ipapi import make_session; make_session() 
from IPython.Debugger import Pdb; Pdb().set_trace() 

Es ist ein bisschen ausführlich, aber gut zu wissen, wenn Sie ipdb nicht installiert haben. Der Anruf make_session ist einmal erforderlich, um das Farbschema usw. einzurichten, und set_trace Anrufe können überall platziert werden, wo Sie brechen müssen.

3

Die schnelle und einfache Art und Weise:

from IPython.Debugger import Tracer 
debug = Tracer() 

Dann einfach

debug() 

schreiben, wo immer Sie Debuggen Programm gestartet werden soll.

+1

'ImportError: Kein Modul mit dem Namen 'IPython.Debugger' auf Python 3.4/IPython 3 – ostrokach

47

In IPython 0.11, Sie IPython direkt im Code wie diese

wie Ihr Programm aussehen könnte diese

In [5]: cat > tmpf.py 
a = 1 

from IPython import embed 
embed() # drop into an IPython session. 
     # Any variables you define or modify here 
     # will not affect program execution 

c = 2 

^D 

einbetten Dies ist, was passiert, wenn Sie es ausführen (ich wählte willkürlich es innerhalb einer bestehenden ipython Sitzung ausgeführt. Das Verschachteln von ipython-Sitzungen wie diese kann nach meiner Erfahrung zum Absturz führen.

In [6]: 

In [6]: run tmpf.py 
Python 2.7.2 (default, Aug 25 2011, 00:06:33) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.11 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: who 
a  embed 

In [2]: a 
Out[2]: 1 

In [3]: 
Do you really want to exit ([y]/n)? y 


In [7]: who 
a  c  embed 
+0

Das Ablegen in eine IPython-Sitzung ist sehr cool. Ich danke dir sehr! – joon

+1

Ich habe das dummerweise in eine (fast unendliche) Schleife gelegt. Wie kann ich jemals rauskommen? – gerrit

+2

@gerrit, drücken Sie Strg + d, wenn Sie noch da sind. – confused00

7

Ich mag einfach fügen Sie diesen Einzeiler in meine Skripte, wo ich einen Haltepunkt setzen möchten:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace() 

Neuere Version verwenden könnte:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace() 
11

Wenn Sie mit einer moderneren Version von IPython (> 0.10.2) können Sie etwas wie

from IPython.core.debugger import Pdb 
Pdb().set_trace() 
verwenden

Aber es ist wahrscheinlich besser, nur ipdb zu verwenden

6

Sieht aus wie Module wurden vor kurzem ein wenig gemischt. Auf IPython 0.13.1 folgende Arbeiten für mich

from IPython.core.debugger import Tracer; breakpoint = Tracer() 

breakpoint() # <= wherever you want to set the breakpoint 

Obwohl ach, es ist alles ziemlich worthless in qtconsole.

4

Neuere Versionen von IPython bieten einen einfachen Mechanismus zum Einbetten und Verschachteln von IPython-Sitzungen in beliebige Python-Programme. Sie können the following recipe folgen zu IPython Sitzungen einbetten:

try: 
    get_ipython 
except NameError: 
    banner=exit_msg='' 
else: 
    banner = '*** Nested interpreter ***' 
    exit_msg = '*** Back in main IPython ***' 

# First import the embed function 
from IPython.frontend.terminal.embed import InteractiveShellEmbed 
# Now create the IPython shell instance. Put ipshell() anywhere in your code 
# where you want it to open. 
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg) 

Dann ipshell() verwenden, wenn Sie in eine IPython Schale fallen wollen. Dadurch können Sie IPython-Interpreter in Ihren Code einbetten (und sogar verschachteln).

2

Ich musste dies ein paar google wenn mal die letzten paar Tage so eine Antwort hinzufügen ... manchmal ist es schön, ein Skript normal laufen zu lassen und nur in ipython/ipdb auf Fehler fallen, ohne ipdb.set_trace() Breakpoints setzen zu müssen in den Code

ipython --pdb -c "%run path/to/my/script.py --with-args here" 

(erste pip install ipython und pip install ipdb natürlich)

+1

Danke! Ein bisschen einfacher: 'ipython --pdb - ./path/to/my/script --with-args here' – alisianoi