En Java/C#, puede recorrer fácilmente el código para rastrear lo que podría estar fallando, y los IDE hacen que este proceso sea muy fácil de usar.
¿Puedes rastrear a través del código python de manera similar?
hombre en blanco
En Java/C#, puede recorrer fácilmente el código para rastrear lo que podría estar fallando, y los IDE hacen que este proceso sea muy fácil de usar.
¿Puedes rastrear a través del código python de manera similar?
¡Sí! Hay un depurador de Python llamado pdb
solo por hacer eso!
Puede iniciar un programa de Python a través de pdb
mediante el uso pdb myscript.py
o python -m pdb myscript.py
.
Hay algunos comandos que puede emitir, que están documentados en el pdb
página.
Algunos útiles para recordar son:
b
: establecer un punto de interrupciónc
: continúe con la depuración hasta que llegue a un punto de interrupcións
: recorrer el códigon
: para ir a la siguiente línea de códigol
: muestra el código fuente del archivo actual (predeterminado: 11 líneas, incluida la línea que se está ejecutando)u
: navegar hacia arriba en 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, IDE de ala o PyCharm tener un depurador GUI. Wing y PyCharm son productos comerciales, pero Wing tiene una edición “Personal” gratuita y PyCharm tiene una edición comunitaria gratuita.
Wow, no puedo creer que esté teniendo dificultades para encontrar un pdb gráfico para linux/ubuntu. ¿Me estoy perdiendo de algo? Puede que tenga que pensar en hacer un SublimeText Plugin para ello.
– ThorSummoner
6 de abril de 2014 a las 9:52
PyCharm es bastante bueno como depurador gráfico, ¡y su Community Edition es gratis!
– Pedro
4 de febrero de 2017 a las 15:45
@ThorSummoner, pudb
es genial para eso también pydev
– alfa_989
11/06/2018 a las 19:45
pdb
no es una herramienta de línea de comandos. Para usarlo, usa python -m pdb your_script.py
.
– jdhao
5 de noviembre de 2018 a las 6:08
@jdhao Supongo que no es estándar, pero en Ubuntu el pdb
El comando es parte del python
paquete. En todo caso, python -m <module>
se está convirtiendo en el estándar para otras cosas también como pip
por lo que probablemente sea mejor usarlo de forma predeterminada.
– wjandrea
7 de julio de 2020 a las 2:47
akD
El primer paso es hacer que el intérprete de Python entre en el modo de depuración.
A. Desde la línea de comandos
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 de manera 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()')
> <string>(1)<module>()
(Pdb)
C. Desde dentro de su programa
Para un proyecto grande y un módulo de larga duración, puede iniciar la depuración desde dentro del programa usando
importar pdb y establecer_traza()
Me gusta esto :
#!/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 interno
Ejecute la siguiente instrucción… con “norte” (próximo)
Repitiendo el último comando de depuración… con INGRESAR
Dejarlo todo… con “q” (dejar)
Imprimiendo el valor de las variables… con “p” (imprimir)
a) Pensilvania
Desactivando el aviso (Pdb)… con “C” (Seguir)
Ver dónde estás… con “yo” (lista)
Entrando en subrutinas… con “s” (entrar en)
Continuando… pero sólo hasta el final de la subrutina actual… con “r” (regreso)
Asignar un nuevo valor
a) !b = “B”
Establecer un punto de interrupción
a) romper el número de línea
B) romper nombre de función
C) romper nombre de archivo: número de línea
Punto de interrupción temporal
a) romper el número de línea
Punto de interrupción condicional
a) romper número de línea, condición
Nota: **Todos estos comandos deben ejecutarse desde **pdb
Para un conocimiento más 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 su secuencia de comandos de python, hace
import pdb
pdb.set_trace()
y entrará en el modo de depuración. Puede usar ‘s’ para avanzar, ‘n’ para seguir la línea siguiente de manera similar a lo que haría con el depurador ‘gdb’.
A partir de Python 3.7, puede utilizar el breakpoint()
Función incorporada para ingresar al depurador:
foo()
breakpoint() # drop into the debugger at this point
bar()
Por defecto, breakpoint()
importará pdb
y llama pdb.set_trace()
. Sin embargo, puede controlar el comportamiento de depuración a través de sys.breakpointhook()
y uso de la variable de entorno PYTHONBREAKPOINT
.
Ver PEP 553 para más información.
Ciro Santilli Путлер Капут 六四事
ipdb agrega la funcionalidad de IPython a pdb, ofreciendo las siguientes ENORMES mejoras:
Al igual que pdg, ipdb aún está lejos de ser perfecto y es completamente rudimentario en comparación con GDB, pero ya es una gran mejora con respecto a pdb.
El uso es análogo a pdb
simplemente instálelo con:
python3 -m pip install --user ipdb
y luego agregue a la línea desde la que desea depurar paso a paso:
__import__('ipdb').set_trace(context=21)
Es probable que desee agregar un acceso directo para eso desde su editor, por ejemplo, para compañero de vim Tengo:
snippet ipd
__import__('ipdb').set_trace(context=21)
para que pueda escribir solo ipd<tab>
y se expande hasta el punto de ruptura. Entonces quitarlo es fácil 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 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 alternativamente, como en raw pdb 3.2+, puede establecer algunos puntos de interrupción desde la línea de comando:
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 preguntado sobre la depuración en: ¿Cómo depurar un módulo de Python que se ejecuta con python -m desde la línea de comando? y dado que Python 3.7 se puede hacer con:
python -m pdb -m my_module
Características graves que faltan tanto en pdb como en ipdb en comparación con GDB:
Molestias específicas de ipdb:
Probado en Ubuntu 16.04, ipdb==0.11, Python 3.5.2.
johnnyheineken
Allí existe breakpoint()
método hoy en día, que reemplaza import pdb; pdb.set_trace()
.
También tiene varias características nuevascomo posibles variables de entorno.
neumático
Si desea utilizar un IDE, hay una buena alternativa a PyCharm: Código VS
mymodule.py
con código Pythonmymodule.py
para establecer un punto de interrupciónF5
y seleccione Debug Python file
Se detendrá en el punto de interrupción y puede hacer su depuración habitual, como inspeccionar los valores de las variables, ya sea en la pestaña VARIABLES
(generalmente a la izquierda) o haciendo clic en Debug Console
(generalmente en la parte inferior al lado de su Terminal
):