¿Cómo salir de pdb y permitir que el programa continúe?

111

Estoy usando el módulo pdb para depurar un programa. Me gustaría entender cómo puedo salir de pdb y permitir que el programa continúe hasta su finalización. El programa es computacionalmente costoso de ejecutar, por lo que no quiero salir sin que el script intente completarse. continueno parece funcionar. ¿Cómo puedo salir de pdb y continuar con mi programa?

Tortuga
fuente
2
continuesalidas de bucles, returnsalidas de métodos / funciones
Stephan
7
@Stephan: Está hablando continuedel comando pdb. No la declaración de Python.
voithos
1
@turtle: continuedebe "Continuar la ejecución, solo detenerse cuando se encuentra un punto de interrupción", según los documentos. ¿Tiene un conjunto de puntos de interrupción que está siendo alcanzado?
voithos
1
ah. OK veo. sí, tengo un punto de ruptura dentro de un bucle. de todos modos para evitar esto? el bucle se llama miles de veces, por lo que no puedo seguir presionando continuar manualmente.
tortuga
1
@turtle: ¿Tiene un punto de interrupción establecido desde dentro de Pdb, o tiene un pdb.set_trace()en su código fuente?
voithos

Respuestas:

190

continuedebe "Continuar la ejecución, solo detenerse cuando se encuentra un punto de interrupción", por lo que tiene un punto de interrupción establecido en alguna parte. Para eliminar el punto de interrupción (si lo insertó manualmente):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

O, si está usando pdb.set_trace(), puede probar esto (aunque si está usando pdb de formas más sofisticadas, esto puede romper las cosas ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
voithos
fuente
10
Lo anterior no sale de pdb.
Steve Barnes
7
¡Sobre la decimoquinta palabra de la pregunta!
Steve Barnes
13
@SteveBarnes: Creo que te lo estás tomando demasiado literalmente. El OP está llegando a un punto de quiebre una y otra vez. Todo lo que necesitan es continuar su proceso de larga duración sin llegar a los puntos de interrupción. Si Pdb se está ejecutando realmente o no es intrascendente.
voithos
35
Buen consejo sobre la configuración set_trace = lambda: None:)
randlet
2
Para los casos extremos, nada mejor set_trace = lambda: None. Python org debería agregar un comando que le permita salir de pdb.
ErezO
26

Un simple Ctrl: Dsaldrá de pdb. Si desea continuar en lugar de interrumpir, simplemente presione en clugar de todo el continuecomando

Minh Triet
fuente
6
¿Qué pasa cuando estás dentro de una función, dentro de un bucle? Parece que simplemente va al siguiente bucle para mí, y en realidad no puedo cerrar pdb, o incluso cerrar Python, sin cerrar toda la terminal.
Marses
@LimokPalantaemon Extraño, ¿has intentado escribirexit
Minh Triet
Esto no funciona si establece una traza o si tiene puntos de interrupción a menos que continúe presionando c.
Alex
vergonzoso, pero esto me salvó de quedar atrapado por mucho tiempo -_-
jmcg
7

La respuesta de @voithos es correcta, por lo que solo agregaré una alternativa en el caso en que esté usando set_trace. Sí, el pdb.set_trace = lambda: Nonetruco funciona bien, pero no si tiene otros puntos de interrupción establecidos y desea volver a habilitarlo más adelante. Para mí, esto apunta al hecho de que, lamentablemente, pdble faltan un montón de funciones (incluso cosas básicas como listas de visualización), y este es otro caso.

La buena noticia es que pdb++es un excelente reemplazo directo pdby una de las cosas que resuelve es exactamente el problema de la desactivación set_trace. Entonces, simplemente puede hacer:

pip install pdbpp

y luego en el (Pdb++)indicador, escriba:

pdb.disable()

Si desea volver a habilitarlo más tarde, como era de esperar, esto funciona:

pdb.enable()

¡Fácil! Y además de eso, obtendrás muchos otros beneficios útiles.

Adam Spires
fuente
4

Si realmente desea salir del depurador, debe ejecutar algo como WinPdb, que le permite desconectarse del proceso y luego salir del depurador (NB: es multiplataforma).

Si desea continuar con la depuración pero ya no se detiene en un punto de interrupción determinado, debe:

  1. Anote el número de punto de interrupción (o el número de archivo y línea),
  2. Ya sea cl bp_number o clear file:line eliminar de forma permanente el punto de interrupción o disable pb_number para desactivarla, pero ser capaz de conmutar de nuevo.
  3. Luego, continuesu programa se ejecutará hasta que se alcance el siguiente punto de interrupción diferente .

Para obtener más detalles sobre lo anterior, consulte el manual .

Steve Barnes
fuente
0

encuentre una nueva forma de salir del pdb sin instalar nada: - cuando el programa comience a ejecutarse, presione ctrl + c, luego cambie la ventana a otra (cualquier ventana), luego el shell original con pdb en ejecución debería mostrar algo como: (pdb) ..... - vuelva a pdb, luego presione Enter, ahora está todo listo, el shell de comandos de pdb reaparece nuevamente

BrainAtom
fuente