Für meine Debugging-Bedürfnisse ist pdb
ziemlich gut. Allerdings wäre es viel Kühler (und hilfreich), wenn ich in ipython
gehen könnte. Ist das möglich?Ist es möglich, aus Code in ipython zu gehen?
Antwort
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)
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)
so gibt es keine Möglichkeit, etwas wie ipython.set_trace des Schreibens()? :) – Geo
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.
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.
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.
'ImportError: Kein Modul mit dem Namen 'IPython.Debugger' auf Python 3.4/IPython 3 – ostrokach
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
Das Ablegen in eine IPython-Sitzung ist sehr cool. Ich danke dir sehr! – joon
Ich habe das dummerweise in eine (fast unendliche) Schleife gelegt. Wie kann ich jemals rauskommen? – gerrit
@gerrit, drücken Sie Strg + d, wenn Sie noch da sind. – confused00
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()
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
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.
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).
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)
Danke! Ein bisschen einfacher: 'ipython --pdb - ./path/to/my/script --with-args here' – alisianoi
Super! Das ist so cool! – Geo
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). –
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. –