Tutorial- ¿ Cómo depurar aplicaciones de Python con PDB?

La depuración no es un truco nuevo: la mayoría de los desarrolladores la usan activamente en su trabajo. Por supuesto, todos tienen su propio enfoque para la depuración, pero he visto que muchos especialistas intentan detectar errores utilizando cosas básicas como en printlugar de herramientas de depuración reales. O incluso si usaron una herramienta de depuración, solo usaron un pequeño conjunto de características y no profundizaron en la amplia gama de oportunidades que ofrecen los buenos depuradores. Y lo que podría haber ahorrado mucho tiempo a esos especialistas.

Depuración de Python con el comando Imprimir

Como se mencionó anteriormente, algunos de nosotros usamos ‘imprimir’ para mostrar información que revela lo que está sucediendo dentro del código. Algunos de nosotros usamos un registrador para el mismo propósito, pero no confunda esto con el registrador para el código de producción, ya que me refiero a los desarrolladores que solo agregan el registrador durante el período de búsqueda del problema, es decir, solo hasta el proceso de desarrollo termina
Pero la verdad es que printtiene muchas lagunas. Probablemente, su mayor inconveniente es que debe agregar cambios a su código, luego volver a ejecutar la aplicación para ver las diferentes variables que está escribiendo, o el tipo de variable actual, por ejemplo. Entonces, ¿cómo es mejor un depurador?

Comandos del depurador de Python

Esencialmente, un depurador es una herramienta que le brinda una forma de, digamos, abrir la aplicación en un lugar determinado para que pueda ver sus variables, la pila de llamadas o lo que necesite ver, establecer puntos de interrupción condicionales, paso a través del código fuente línea por línea, etc. Es como abrir el capó de su automóvil para ver de dónde proviene el humo, buscando parte por parte para identificar el problema.
Si está trabajando con Python, no solo puede mirar el código durante la depuración, sino que también puede ejecutar el código que está escrito en la línea de comando o incluso afectar el proceso al cambiar el valor de las variables.
Python tiene un depurador incorporado llamado pdbEs una utilidad simple con una interfaz de línea de comando que hace el trabajo principal. Tiene todas las características del depurador que necesitará, pero si está buscando mejorarlo un poco, puede extenderlo usando ipdb, que proporcionará al depurador las características de IPython.
La forma más fácil de usar pdbes llamarlo en el código en el que está trabajando.
importar pdb; pdb.set_trace ()
Tan pronto como el intérprete llegue a esta línea, recibirá un símbolo del sistema en el terminal donde está ejecutando el programa. Este es un indicador general de Python, pero con algunos comandos nuevos.

lista (l)

El comando list (l) le mostrará la línea de código en la que se encuentra actualmente el intérprete de Python. Si desea verificar un área diferente del código, este comando tiene argumentos para mostrar la primera y la última línea. Si proporciona solo el número de la primera línea, podrá ver el código alrededor de la línea que ha proporcionado.

arriba (p) y abajo (d)

Arriba (p) y abajo (d) son los dos comandos necesarios para navegar por la pila de llamadas. Con la ayuda de estos comandos, puede ver quién está llamando a la función actual, por ejemplo, o por qué el intérprete va por este camino.

paso (s) y siguiente (n)

Otro par importante de comandos, paso (s) y siguiente (n), lo ayudan a continuar la ejecución de la aplicación línea por línea. La única diferencia entre estos dos es que el siguiente (n) solo irá a la siguiente línea de la función actual, incluso si tiene una llamada para otra función, pero los pasos irán más profundo en un caso como este.

descanso (b)

El comando break (b) le permite configurar nuevos puntos de interrupción sin cambiar el código. Requiere un poco más de explicación, así que entraré en detalles a continuación.
Aquí hay una breve descripción de otros pdbcomandos:

También te puede interesar:

Depurador de Python por adelantado

Anteriormente, los cambios de código eran necesarios para imprimir algo o establecer un punto de interrupción. Sin embargo, con bastante frecuencia necesita establecer el punto de interrupción dentro de un paquete de terceros. Por supuesto, puede abrir el código fuente de una biblioteca en cualquier momento desde su entorno virtual y agregar una solicitud pdb.
Pero ahora puede ejecutar la aplicación desde el depurador y establecer puntos de interrupción sin ningún cambio en el código fuente. Para ejecutar la aplicación con el depurador, utilice el comando python -m pdb <python script>.
Dejame mostrarte un ejemplo. Tengo esta sencilla aplicación que rastrea mi tiempo de trabajo. En su interior, uso la requestsbiblioteca para realizar solicitudes HTTP y quiero interrumpir una solicitud posterior. ¿Cómo hago esto? Ejecuto mi aplicación con el depurador y establezco un punto de interrupción dentro de la requestsbiblioteca.
$ python -m pdb run.py 
> /Users/.........................../run.py(1) <módulo> ( )
-> desde TimeLog.app import run_app
(Pdb) b peticiones / sessions.py: 555
Breakpoint 1 en /..................../lib/python3.6 /site-packages/requests/sessions.py:555
(Pdb) c
Como puede ver, no necesita ingresar la ruta completa al archivo fuente. Simplemente ingresa una ruta relativa desde cualquier carpeta sys.path, de la misma manera que haría una importación en su código.

Ahora es más fácil establecer el punto de interrupción. No es necesario ponerlo en algún lugar de su propio código e ir paso a paso a la función que necesita, o para encontrar el archivo fuente de la biblioteca y cambiarlo.
Pero, ¿qué sucede si la aplicación realiza muchas llamadas y necesita una llamada en particular? Fácil. Puede especificar una condición de punto de interrupción, y el depurador interrumpirá la aplicación solo si esta condición se considera True.
En este ejemplo, la aplicación se interrumpirá solo si jsontiene una time_entryclave.
python -m pdb run.py   
> /Users/...../run.py(1) <module> ()
-> desde TimeLog.app import run_app
(Pdb) b peticiones / sessions.py: 555, json es no None y 'time_entry' en json
Breakpoint 1 en /Users/....../lib/python3.6/site-packages/requests/sessions.py:555
(Pdb) c

Ayudante de depuración para Django

Si está utilizando el marco web de Django, probablemente sepa que si DEBUGestá configurado Trueen su configuración, en cualquier excepción verá una página especial con información como tipo de excepción y mensaje, rastreo, variables locales, etc.
Si desea mejorar su página de depuración de esta manera, instale django-extensions y use el runserver_pluscomando para iniciar su servidor Django para el desarrollo. Y en caso de que necesite configurar un pin de depurador, aquí hay un ejemplo de cómo hacerlo:
WERKZEUG_DEBUG_PIN=1234 ./manage.py runserver_plus
Si usa django-extensiones en lugar de esta página predeterminada, obtendrá una página de rastreo donde podrá ver el código de cada línea y un depurador abierto.
El proceso de depuración se lleva a cabo con la ayuda del proyecto Werkzeug , que es una biblioteca WSGI para Python.

Como puede ver, hay numerosas formas de usar un depurador. No es demasiado complicado, pero al mismo tiempo, le brindará toneladas de ventajas: no solo ganará una reputación como desarrollador de kickass, sino que también se ahorrará mucho tiempo y energía, y aprenderá a evitar diferentes errores en el futuro. Y, por supuesto, tanto el producto como su cliente ganarán si utiliza un depurador adecuado. Entonces, es literalmente un beneficio mutuo para todos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Más info

aceptar