Respuestas:
¡Si! ¡Hay un depurador de Python llamado pdb
solo por hacer eso!
Puede iniciar un programa Python pdb
mediante pdb myscript.py
o python -m pdb myscript.py
.
Hay algunos comandos que puede emitir, que están documentados en la pdb
página.
Algunos útiles para recordar son:
b
: establecer un punto de interrupciónc
: continúe depurando hasta llegar a un punto de interrupcións
: paso por el códigon
: para ir a la siguiente línea de códigol
: lista el código fuente del archivo actual (predeterminado: 11 líneas, incluida la línea que se está ejecutando)u
: navegar por un marco de pilad
: navegar por un marco de pilap
: para imprimir el valor de una expresión en el contexto actualSi no desea utilizar un depurador de línea de comandos, algunos IDE como Pydev , Wing IDE o PyCharm tienen un depurador de GUI. Wing y PyCharm son productos comerciales, pero Wing tiene una edición "Personal" gratuita, y PyCharm tiene una edición comunitaria gratuita.
pudb
es genial para eso. Tambiénpydev
pdb
No es una herramienta de línea de comandos. Para usarlo, use python -m pdb your_script.py
.
pdb
comando es parte del python
paquete. En cualquier caso, también se python -m <module>
está convirtiendo en el estándar para otras cosas pip
, por lo que probablemente sea mejor usarlo de forma predeterminada.
El primer paso es hacer que el intérprete de Python ingrese al 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)<module>()
-> """
(Pdb)
B. Dentro del intérprete
Al desarrollar versiones tempranas de módulos y experimentarlo más iterativamente.
$ 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()')
> <string>(1)<module>()
(Pdb)
C. Desde dentro de su programa
Para un gran proyecto y un módulo de larga ejecución, puede iniciar la depuración desde el interior del programa utilizando 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()
Depuración paso a paso para entrar en más interna
Ejecute la siguiente declaración ... con "n" (siguiente)
Repetir el último comando de depuración ... con ENTER
Dejarlo todo ... con "q" (salir)
Imprimir el valor de las variables ... con "p" (imprimir)
a) pa
Desactivar el indicador (Pdb) ... con "c" (continuar)
Ver dónde estás ... con "l" (lista)
Entrar en subrutinas ... con "s" (entrar)
Continuando ... pero justo hasta el final de la subrutina actual ... con "r" (retorno)
Asignar un nuevo valor
a) ! b = "B"
Establecer un punto de interrupción
a) romper el número de lino
b) nombre de función de interrupción
c) romper el nombre del archivo: número de lino
Punto de interrupción temporal
a) romper el número de lino
Punto de corte condicional
a) romper el número de lino, condición
Nota: ** Todos estos comandos deben ejecutarse desde ** pdb
Para un conocimiento profundo, consulte: -
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, lo haces
import pdb
pdb.set_trace()
y entrará en modo de depuración. Puede usar 's' para avanzar, 'n' para seguir la siguiente línea similar a lo que haría con el depurador 'gdb'.
A partir de Python 3.7, puede usar la breakpoint()
función incorporada para ingresar al depurador:
foo()
breakpoint() # drop into the debugger at this point
bar()
Por defecto, breakpoint()
importará pdb
y llamará pdb.set_trace()
. Sin embargo, puede controlar el comportamiento de depuración mediante el sys.breakpointhook()
uso de la variable de entorno PYTHONBREAKPOINT
.
Ver PEP 553 para más información.
breakpoint
que estaba emocionado. Pero luego aprendí que es esencialmente un atajo import pdb; pdb.set_trace()
y eso me entristeció. Desarrolladores de Python: concéntrese en mejorar PDB con características básicas de GDB como líneas de contexto, historial de comandos persistente y finalización automática de pestañas :-)
ipdb agrega la funcionalidad IPython a pdb, ofreciendo las siguientes ENORMES mejoras:
Al igual que pdg, ipdb todavía está lejos de ser perfecto y completamente rudimentario en comparación con GDB, pero ya es una gran mejora con respecto a pdb.
El uso es análogo pdb
, simplemente instálelo con:
python3 -m pip install --user ipdb
y luego agregue a la línea desde la que desea depurar:
__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<tab>
y se expande hasta el punto de interrupción. Luego, eliminarlo es fácil 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 durante la depuración?
Alternativamente, también puede depurar programas desde el principio con:
ipdb3 main.py
pero generalmente no quieres hacer eso porque:
O, como alternativa, como en el pdb 3.2+ en bruto, puede establecer algunos puntos de interrupción desde la línea de comandos:
ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py
aunque -c c
está roto por alguna razón: https://github.com/gotcha/ipdb/issues/156
python -m module
Se ha solicitado la depuración en: ¿Cómo depurar un módulo Python ejecutado con python -m desde la línea de comandos? y desde Python 3.7 se puede hacer con:
python -m pdb -m my_module
Serias características faltantes de pdb e ipdb en comparación con GDB:
molestias específicas de ipdb:
Probado en Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.
Existe un breakpoint()
método hoy en día, que reemplaza import pdb; pdb.set_trace()
.
También tiene varias características nuevas , como posibles variables de entorno.
Si desea un IDE con depurador integrado, pruebe PyScripter .
https://wiki.python.org/moin/PythonDebuggingTools
pudb es un buen reemplazo directo para pdb
Python Tutor es un depurador en línea de un solo paso destinado a principiantes. Puede poner el código en la página de edición y luego hacer clic en "Visualizar ejecución" para iniciar su ejecución.
Entre otras cosas, admite:
Sin embargo, tampoco es compatible con muchas cosas , por ejemplo:
io.StringIO
y en su io.BytesIO
lugar: demoTambién es posible avanzar y rastrear mediante programación el 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 comenzar.
Visual Studio con PTVS podría ser una opción para usted: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
PyCharm es un IDE para Python que incluye un depurador. Mire este video de YouTube para obtener una introducción sobre el uso del depurador de PyCharm para recorrer el código.
Tutorial de PyCharm: depure el código de Python con PyCharm
Nota: Esto no pretende ser un endoso o revisión. PyCharm es un producto comercial que hay que pagar, pero la compañía proporciona una licencia gratuita a estudiantes y profesores, así como una versión comunitaria "ligera" que es gratuita y de código abierto.