Domanda

Per le mie esigenze di debugging, pdb è piuttosto buona. Tuttavia, sarebbe stato molto più fresco (e disponibile) se potevo andare in ipython. E 'questa cosa possibile?

È stato utile?

Soluzione

Non è un progetto che incorpora ipdb ipython nel PPB standard, quindi si può solo fare:

import ipdb; ipdb.set_trace()

E 'installabile tramite il solito pip install ipdb.

ipdb è piuttosto breve, così invece di easy_installing è anche possibile creare un file ipdb.py qualche parte sul vostro percorso Python e incollare il seguente nel file:

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)

Altri suggerimenti

In IPython 0,11, è possibile incorporare IPython direttamente nel codice come questo

Il programma potrebbe essere simile a questo

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

Questo è ciò che accade quando si esegue (I arbitrariamente scelto di eseguirlo all'interno di una sessione di ipython esistente. Sedute ipython nidificazione come questo nella mia esperienza può causare il crash).

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

Se si utilizza una versione più moderna di IPython (> 0.10.2) è possibile usare qualcosa come

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

Ma è probabilmente meglio utilizzare solo IPDB

L'equivalente di

import pdb; pdb.set_trace()

con IPython è qualcosa di simile:

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

E 'un po' prolisso, ma bene sapere se non si dispone di IPDB installato. La chiamata make_session è necessario una volta per impostare la combinazione di colori, ecc, e le chiamate set_trace può essere posizionato ovunque è necessario rompere.

Normalmente, quando uso ipython, accendo debug automatico con il comando "pdb" al suo interno.

Poi ho eseguito il mio script con il "run myscript.py" comando nella directory in cui si trova il mio script.

Se ricevo un'eccezione, ipython arresta il programma all'interno del debugger. Scopri il comando help per la magia ipython comandi (% magic)

mi piace per incollare semplicemente questo one-liner nei miei script in cui voglio impostare un punto di interruzione:

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

versione più recente potrebbe utilizzare:

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

Sembra che i moduli sono stati mischiato un po 'intorno di recente. Su IPython 0.13.1 i seguenti lavori per me

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

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

Anche se, ahimè, è tutto inutile in qtconsole .

Le versioni più recenti di IPython forniscono un meccanismo semplice per l'incorporamento e la nidificazione sessioni ipython in tutti i programmi Python. È possibile seguire la seguente ricetta per incorporare le sessioni ipython:

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)

Quindi utilizzare ipshell() ogni volta che si vuole far cadere in un guscio IPython. Questo vi permetterà di inserire (e anche il nido) interpreti ipython nel codice.

Da docs ipython :

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

lancerà un guscio IPython di programmazione. Ovviamente i valori nelle dict namespace sono valori fittizi solo - potrebbe avere più senso utilizzare locals() in pratica

.

Si noti che è necessario codificare questo; non sta andando per lavorare nel modo pdb fa. Se questo è ciò che si vuole, risposta DoxaLogos' è probabilmente più simile a quello che stai cercando.

Il modo più veloce e facile-:

from IPython.Debugger import Tracer
debug = Tracer()

Poi basta scrivere

debug()

dove si vuole iniziare il debug del programma.

Ho dovuto google questo un paio se volte negli ultimi giorni in modo da aggiungere una risposta ... a volte è bello essere in grado run uno script normalmente e rilasciare solo in ipython / IPDB sugli errori, senza dover mettere i punti di interruzione in ipdb.set_trace() il codice

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

(prima pip install ipython e pip install ipdb ovviamente)

Questo è abbastanza semplice:

ipython some_script.py --pdb

Ha bisogno ipython installazione, di solito questo funziona: pip install ipython

Io uso ipython3 invece di ipython, quindi so che è una versione più recente di Python.

Questo è semplice da ricordare, perché è sufficiente utilizzare ipython invece di pitone, e aggiungere --pdb fino alla fine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top