E 'possibile andare in ipython dal codice?
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?
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.