Buscar..


El depurador de Python: depuración paso a paso con _pdb_

La biblioteca estándar de Python incluye una biblioteca de depuración interactiva llamada pdb . pdb tiene capacidades extensivas, la más comúnmente utilizada es la capacidad de "avanzar" en un programa.

Para entrar de inmediato en el uso de depuración paso a paso:

python -m pdb <my_file.py>

Esto iniciará el depurador en la primera línea del programa.

Por lo general, deseará apuntar a una sección específica del código para la depuración. Para hacer esto, importamos la biblioteca pdb y usamos set_trace () para interrumpir el flujo de este código de ejemplo problemático.

import pdb

def divide(a, b):
    pdb.set_trace()
    return a/b 
    # What's wrong with this? Hint: 2 != 3

print divide(1, 2)

Ejecutando este programa se iniciará el depurador interactivo.

python foo.py 
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb) 

A menudo, este comando se usa en una línea, por lo que se puede comentar con un solo # carácter

 import pdf; pdb.set_trace()

En el comando (Pdb) se pueden introducir comandos. Estos comandos pueden ser comandos de depuración o python. Para imprimir variables podemos usar p del depurador, o la impresión de python.

(Pdb) p a
1
(Pdb) print a
1

Para ver la lista de todas las variables locales use

locals

función incorporada

Estos son buenos comandos de depuración para saber:

b <n> | <f>: set breakpoint at line *n* or function named *f*.
# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control back to the debugger
next: run the program until the next line of execution in the current function, then return control back to the debugger
return: run the program until the current function returns, then return control back to the debugger
continue: continue running the program until the next breakpoint (or set_trace si called again)

El depurador también puede evaluar python interactivamente:

-> return a/b
(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]] 
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]

Nota:

Si alguno de sus nombres de variable coincide con los comandos del depurador, use un signo de exclamación ' ! 'antes de la var para referirse explícitamente a la variable y no al comando del depurador. Por ejemplo, a menudo puede suceder que use el nombre de variable ' c ' para un contador, y tal vez desee imprimirlo mientras está en el depurador. un simple comando ' c ' continuaría la ejecución hasta el siguiente punto de interrupción. En su lugar, use ' ! C ' para imprimir el valor de la variable de la siguiente manera:

(Pdb) !c
4

A través de IPython y ipdb

Si se instala IPython (o Jupyter ), se puede invocar al depurador usando:

import ipdb
ipdb.set_trace()

Cuando se alcanza, el código saldrá e imprimirá:

 /home/usr/ook.py(3)<module>()
      1 import ipdb
      2 ipdb.set_trace()
----> 3 print("Hello world!")

ipdb>

Claramente, esto significa que uno tiene que editar el código. Hay una forma más sencilla:

from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
                                     color_scheme='Linux',
                                     call_pdb=1)

Esto hará que se llame al depurador si se produce una excepción no detectada.

Depurador remoto

Algunas veces necesitas depurar el código python que se ejecuta mediante otro proceso y, en este caso, rpdb es muy útil.

rpdb es un envoltorio alrededor de pdb que redirige stdin y stdout a un controlador de socket. Por defecto abre el depurador en el puerto 4444.

Uso:

# In the Python file you want to debug.
import rpdb
rpdb.set_trace()

Y luego necesitas ejecutar esto en la terminal para conectarte a este proceso.

# Call in a terminal to see the output
$ nc 127.0.0.1 4444

Y obtendrás pdb promt

> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow