¿Cómo pasar por el código de Python para ayudar a solucionar problemas?

En Java / C # puede pasar fácilmente a través del código para rastrear lo que podría estar mal, y los IDE hacen que este proceso sea muy fácil de usar.

¿Puedes rastrear a través del código de Python de una manera similar?

¡Sí! ¡Hay un depurador de Python llamado pdb solo por hacer eso!

Puede iniciar un progtwig Python a través de pdb usando pdb myscript.py o python -m pdb myscript.py .

Hay algunos comandos que puede emitir, que están documentados en la página pdb .

Algunos útiles para recordar son:

  • b : establecer un punto de interrupción
  • c : continúa la depuración hasta que llegues a un punto de interrupción
  • s : paso a través del código
  • n : para ir a la siguiente línea de código
  • l : código fuente de la lista para el archivo actual (predeterminado: 11 líneas, incluida la línea que se está ejecutando)
  • u : navegar hacia arriba un marco de stack
  • d : navegar hacia abajo un marco de stack
  • p : para imprimir el valor de una expresión en el contexto actual

Si no desea utilizar un depurador de línea de comandos, algunos IDE como Pydev tienen un depurador de GUI.

Usando el depurador interactivo de Python ‘pdb’

El primer paso es hacer que el intérprete de Python entre en el modo de depuración.

A. Desde la línea de comando

La forma más directa, desde la línea de comandos, del intérprete de python

 $ python -m pdb scriptName.py > .../pdb_script.py(7)() -> """ (Pdb) 

B. Dentro del intérprete

Al desarrollar versiones tempranas de módulos y experimentarlo de forma más iterativa.

 $ python Python 2.7 (r27:82508, Jul 3 2010, 21:12:11) [GCC 4.0.1 (Apple Inc. build 5493)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pdb_script >>> import pdb >>> pdb.run('pdb_script.MyObj(5).go()') > (1)() (Pdb) 

C. Desde dentro de su progtwig

Para un proyecto grande y un módulo de larga ejecución, puede iniciar la depuración desde el interior del progtwig usando import pdb y set_trace () de esta manera:

 #!/usr/bin/env python # encoding: utf-8 # import pdb class MyObj(object): count = 5 def __init__(self): self.count= 9 def go(self): for i in range(self.count): pdb.set_trace() print i return if __name__ == '__main__': MyObj(5).go() 

Paso a paso la depuración para ir más interno

  1. Ejecutar la siguiente statement … con “n” (siguiente)

  2. Repitiendo el último comando de depuración … con ENTER

  3. Dejarlo todo … con “q” (salir)

  4. Imprimiendo el valor de las variables … con “p” (imprimir)

    a) pa

  5. Desactivando el aviso (Pdb) … con “c” (continuar)

  6. Viendo dónde estás … con “l” (lista)

  7. Entrar en subrutinas … con “s” (entrar en)

  8. Continuando … pero solo hasta el final de la subrutina actual … con “r” (retorno)

  9. Asignar un nuevo valor

    a) ! b = “B”

  10. Establecer un punto de interrupción

    a) romper el número de lino

    b) romper nombre de la función

    c) romper el nombre del archivo: linenumber

  11. Punto de quiebre temporal

    a) tbreak linumber

  12. Punto de ruptura condicional

    a) romper el número de lino, condición

Nota: ** Todos estos comandos deben ejecutarse desde ** pdb

Para un conocimiento en profundidad, consulte: –

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

Hay un módulo llamado ‘pdb’ en python. En la parte superior de tu script de Python haces

 import pdb pdb.set_trace() 

y entrarás en modo de depuración. Puede usar ‘s’ para pasar, ‘n’ para seguir la siguiente línea similar a lo que haría con el depurador ‘gdb’.

Comenzando en Python 3.7, puede usar la función incorporada breakpoint() para ingresar al depurador:

 foo() breakpoint() # drop into the debugger at this point bar() 

De forma predeterminada, breakpoint() importará pdb y llamará a pdb.set_trace() . Sin embargo, puede controlar el comportamiento de depuración a través de sys.breakpointhook() y el uso de la variable de entorno PYTHONBREAKPOINT .

Ver PEP 553 para más información.

ipdb

ipdb agrega la funcionalidad de IPython a pdb, ofreciendo las siguientes GRANDES mejoras:

  • completar la pestaña
  • mostrar más líneas de contexto
  • resaltado de syntax

El uso es análogo a pdb , solo instálelo con:

 python3 -m pip install --user ipdb 

y luego agregue a la línea de la que quiere pasar la depuración:

 __import__('ipdb').set_trace(context=21) 

Es probable que desee agregar un acceso directo para eso desde su editor, por ejemplo, para Vim snipmate tengo:

 snippet ipd __import__('ipdb').set_trace(context=21) 

así que puedo escribir solo ipd y se expande hasta el punto de interrupción. Luego es fácil eliminarlo con dd ya que todo está contenido en una sola línea.

context=21 aumenta el número de líneas de contexto como se explica en: ¿Cómo puedo hacer que ipdb muestre más líneas de contexto mientras se realiza la depuración?

Alternativamente, también puede depurar progtwigs desde el principio con:

 ipdb3 main.py 

pero generalmente no quieres hacer eso porque:

  • tendría que pasar por todas las definiciones de funciones y clases a medida que Python lee esas líneas
  • No sé cómo establecer el tamaño de contexto allí sin hackear ipdb. Parche para permitirlo: https://github.com/gotcha/ipdb/pull/155

O alternativamente, como en el pdb 3.2+ en bruto, puede establecer algunos puntos de interrupción desde la línea de comando:

 ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py 

aunque -cc está roto por alguna razón: https://github.com/gotcha/ipdb/issues/156

La finalización de la pestaña funciona con la Tab como en IPython.

Al igual que pdg, ipdb aún está lejos de ser perfecto y completamente rudimentario en comparación con GDB, pero ya es una gran mejora con respecto a pdb.

python -m module depuración del python -m module se ha preguntado en: ¿Cómo depurar un módulo Python ejecutado con python -m desde la línea de comandos? y como Python 3.7 se puede hacer con:

 python -m pdb -m my_module 

Serias características faltantes de pdb y ipdb en comparación con GDB:

  • Historial de comandos persistente en todas las sesiones: Guardar el historial de comandos en pdb

Probado en Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

Si viene de Java / C # background, supongo que lo mejor sería usar Eclipse con Pydev . Esto le proporciona un IDE completamente funcional con el depurador incorporado. También lo uso con django.

Si desea un IDE con un depurador integrado, pruebe PyScripter .

También es posible progtwigr y rastrear a través del código de Python (¡y es fácil!). Mire la documentación de sys.settrace () para más detalles. También aquí hay un tutorial para empezar.

https://wiki.python.org/moin/PythonDebuggingTools

pudb es un buen reemplazo directo para pdb

PyCharm es un IDE para Python que incluye un depurador. Mire este video de YouTube para una introducción sobre el uso del depurador de PyCharm para recorrer el código.

Tutorial de PyCharm – Depurar el código de Python usando PyCharm

Nota: Esto no pretende ser un aval o revisión. PyCharm es un producto comercial por el que se debe pagar, pero la compañía proporciona una licencia gratuita para estudiantes y profesores, así como una versión comunitaria “ligera” que es gratuita y de código abierto.

Captura de pantalla