it-swarm.com.de

Kann ich von Code aus in ipython gehen?

Für meine Debugging-Anforderungen ist pdb ziemlich gut. Es wäre jedoch viel cooler (und hilfreich), wenn ich in ipython gehen könnte. Ist das möglich?

77
Geo

Es gibt ein ipdb-Projekt, das iPython in die Standard-PDB einbettet. Sie können also Folgendes tun:

import ipdb; ipdb.set_trace()

Es kann über den üblichen pip install ipdb installiert werden.

ipdb ist ziemlich kurz. Anstelle von easy_installing können Sie auch eine Datei ipdb.py irgendwo in Ihrem Python-Pfad erstellen und Folgendes 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)
108
Daniel Roseman

In IPython 0.11 können Sie IPython auf diese Weise direkt in Ihren Code einbetten

Ihr Programm könnte so aussehen

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

Dies geschieht, wenn Sie es ausführen (ich habe es willkürlich ausgewählt, es in einer vorhandenen ipython-Sitzung auszuführen. Wenn Sie solche ipython-Sitzungen in meiner Erfahrung verschachteln, kann dies 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
50
Alex Gaudio

Wenn Sie eine modernere Version von IPython verwenden (> 0.10.2), können Sie so etwas verwenden

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

Es ist jedoch wahrscheinlich besser, nur ipdb zu verwenden 

11
chrisdev

Das Äquivalent von 

import pdb; pdb.set_trace()

mit IPython ist so 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 es ist gut zu wissen, ob Sie ipdb nicht installiert haben. Der make_session-Aufruf ist einmalig, um das Farbschema usw. einzurichten, und set_trace-Aufrufe können an beliebigen Stellen platziert werden, an denen Sie eine Unterbrechung benötigen.

11
ars

Normalerweise schalte ich bei Verwendung von ipython das automatische Debugging mit dem Befehl "pdb" ein.

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

Wenn ich eine Ausnahme bekomme, stoppt ipython das Programm im Debugger. Checke den Hilfebefehl für die magischen ipython-Befehle (% magic)

8
Jay Atkinson

Ich füge diesen Einzeiler einfach in meine Skripte ein, wo ich einen Haltepunkt setzen möchte:

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

Neuere Versionen verwenden möglicherweise:

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

Es sieht so aus, als ob Module in letzter Zeit ein bisschen gemischt wurden. Unter IPython 0.13.1 funktioniert Folgendes für mich

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

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

Leider ist alles hübsch wertlos in qtconsole .

6
beardc

Neuere Versionen von IPython bieten einen einfachen Mechanismus zum Einbetten und Verschachteln von IPython-Sitzungen in beliebige Python-Programme. Sie können dem folgenden Rezept folgen, um IPython-Sitzungen einzubetten:

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)

Verwenden Sie dann ipshell(), wenn Sie in eine IPython-Shell wechseln möchten. Auf diese Weise können Sie IPython-Interpreter in Ihren Code einbetten (und sogar verschachteln).

Aus den IPython-Dokumenten :

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

startet programmgesteuert eine IPython-Shell. Offensichtlich handelt es sich bei den Werten in der Variable namespace nur um Dummy-Werte. In der Praxis ist es sinnvoller, locals() zu verwenden.

Beachten Sie, dass Sie dies hart in kodieren müssen; Es wird nicht so funktionieren wie pdb. Wenn Sie das wollen, ist DoxaLogos wahrscheinlich eher das, wonach Sie suchen.

3
David Z

Der schnelle und einfache Weg:

from IPython.Debugger import Tracer
debug = Tracer()

Dann schreib einfach

debug()

wo Sie mit dem Debuggen Ihres Programms beginnen möchten.

3
Viktiglemma

Ich musste dies ein paar Mal googeln, wenn in den letzten Tagen eine Antwort hinzugefügt wurde. Manchmal ist es schön, ein Skript normal ausführen zu können und bei Fehlern nur in ipython/ipdb zu speichern, ohne ipdb.set_trace()-Haltepunkte in den Code einfügen zu müssen

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

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

2
Anentropic

Das ist ziemlich einfach:

ipython some_script.py --pdb

Es muss iPython installiert werden, normalerweise funktioniert dies: pip install ipython

Ich verwende ipython3 anstelle von ipython, daher weiß ich, dass es sich um eine aktuelle Version von Python handelt.

Dies ist einfach zu merken, da Sie statt Python nur iPython verwenden und am Ende --pdb hinzufügen.

0
Luke Stanley