studio - pdb/ipdb para ruptura de Python en condición editable
python debugger online (3)
Digamos que tengo codificado el siguiente código:
for i in range(100):
print i
En general puedo agregar una línea al código como:
for i in range(100):
import ipdb;ipdb.set_trace()
print i
Sin embargo, ahora quiero depurarlo con la condición de i == 10
, y no quiero molestarme escribiendo c
10 veces en ipdb, ¿cómo debo hacerlo?
En la documentación encontré la condition bpnumber [condition]
, pero ¿cómo podría saber el bpnumber
si no hay una lista del índice bpnumber
? La documentación también dice b(reak) ([file:]lineno | function) [, condition]
. Por ejemplo, suponga que el número de línea de print i
es xx
. Ingresé lo siguiente en la shell de ipdb: b xx, i == 10
pero no sucedió nada como se esperaba.
Creo que estaba buscando una solución más directa que no implicara agregar líneas al código, y solo involucró comandos de depuración.
Su ejemplo original de
b xx, i == 10
no funciona, porque está configurando un punto de interrupción en el lugar en el código en el que insertó el comando ipdb.set_trace (). Al agregar la declaración ''b xx, i == 10'' en el depurador, en realidad tiene 2 puntos de ruptura (1 condicional y 1 incondicional) definidos en la misma ubicación (suponiendo que xx es la línea donde está el comando set_trace ()).
Alternativamente, una vez que haya definido los puntos de interrupción en su código con el comando ''b'', que aparentemente funciona para usted. Puede agregar una condición al punto de interrupción
condition bpnumber boolean-expression
por ejemplo
condition 1 i == 10
Nota: el bpnumber es el número asignado al punto de interrupción, no la línea en su código. Para ver una lista de puntos de interrupción, simplemente escriba ''b'' sin argumentos.
Además, si desea ingresar al modo de depuración sin usar ipdb.set_trace (), simplemente ejecute su código con el módulo pdb / ipbd habilitado
python -m pdb foo.py
Hay una manera sucia y rápida como esta:
for i in range(100):
if i == 10: import ipdb;ipdb.set_trace()
print i
Funciona y no tienes que ocupar tu mente con ningún otro comando :)
bien, yo también exploré un poco, aquí está mi nueva comprensión de pdb. cuando import ipdb;ipdb.set_trace()
realmente agrega un punto de entrada de ipdb a la línea, no es realmente un punto de interrupción. después de ingresar ipdb, puede configurar puntos de interrupción
así que, para darme cuenta de lo que quiero para la depuración condicional, debo agregar lo siguiente
import ipdb;ipdb.set_trace()
for i in range(100):
print i
luego, después de ingresar ipdb, puedo ingresar b xx, i == 10
y luego c
o r
para ejecutar el código, luego el código se detendrá cuando se cumpla la condición. cuando ingreso l
, el número de archivo de paquete se muestra para la línea como:
xx-1 for i in range(100):
bpnumber> xx print i
xx+1 ...
Tengo que decir que el documento y todas las demás explicaciones son tan confusas, deseo que mi respuesta aclare la diferencia entre el "punto de entrada de depuración" y el "punto de interrupción de depuración"