Ipython: Cuelgue después de ejecutar pdb en una celda, Kernel / Interrupt no ayuda

Creado en 8 may. 2017  ·  34Comentarios  ·  Fuente: ipython/ipython

Si depura una celda a través de pdb, no la salga antes de volver a ejecutar la celda, no podrá volver a su entorno de IPython. Reprodúzcalo mediante

pdb_resists_kernel_interrupt ipynb

Para el registro y los motores de búsqueda, para colgar su cuaderno:

  • Ejecute la siguiente celda
  • No "salga" a través del indicador de pdb
  • Luego ejecútelo de nuevo.
def test():
    import pdb; pdb.set_trace()  # XXX BREAKPOINT
    return 0

test()

Tenga en cuenta que Kernel / Interupt no ayuda. Puede guardar el cuaderno, pero para ejecutar celdas nuevamente, debe reiniciar el kernel, momento en el que "Se perderán todas las variables"

Esto me sucede con frecuencia si estoy buscando en el resto del cuaderno sugerencias sobre cómo depurar la celda, luego olvido salir antes de cambiar la celda y ejecutarla nuevamente. Sí, puedo tener más cuidado, pero otros tienen la misma experiencia. Gracias a @wmayner por un caso de prueba conveniente descrito en # 3400.

Estoy ejecutando Jupyter notebook 4.3.1 en Python 3.4.3 (predeterminado, 17 de noviembre de 2016, 01:08:31) [GCC 4.8.4]
Información del kernel: Python 3.4.3 (predeterminado, 17 de noviembre de 2016, 01:08:31)

Entrada de @takluyver en # 10499

pdb se ejecuta en el mismo proceso y sabemos cuándo espera una entrada. Creo que se necesita que alguien haga el trabajo para que cuando se elimine el cuadro de entrada HTML en la interfaz, se envíe un mensaje al kernel que generará EOFError.
Eso puede necesitar un nuevo tipo de mensaje, o podríamos hacerlo como un campo de metadatos en el mensaje de respuesta stdin existente.

notebook

Comentario más útil

También me mordió esto. ¿Cómo suele depurar la gente en el cuaderno jupyter? Usar pdb es como hacer malabares con una granada :(

Todos 34 comentarios

Me estoy enfrentando al mismo problema.

Absolutamente, lo mismo aquí. Este es un dolor real en las partes bastante sensibles de mi cuerpo. Si existiera una forma conveniente de detener pdb sin la celda en ejecución, esto podría aliviarse. Alternativamente, sería importante al menos una forma de guardar su trabajo antes de apagar el portátil (por ejemplo, una red neuronal entrenada y el portátil se bloquea al guardar después de 2000 épocas).

También tengo este problema, con la versión 4.30 de Jupyter, Python 3.6.2. Reiniciar el kernel parece ser la única forma de manejar este problema.

Acabo de perder un cálculo de 8 horas debido a esto ... es hora de empezar de nuevo.

Acabo de perder un cálculo de 64 horas en el que se supone que debo presentar los resultados hoy.

¿Nadie encontró una solución?

También me mordió esto. ¿Cómo suele depurar la gente en el cuaderno jupyter? Usar pdb es como hacer malabares con una granada :(

¡Por favor, corrija esto! Constantemente recibo este problema.

Aquí igual. Tengo que rehacer un cálculo muy largo.

aquí igual.

alguien por favor arregle y le pagaré $ 5

@zsal Si es en serio, puede agregar este problema en https://www.bountysource.com

El mismo problema aqui. Necesito una forma de interrumpir un proceso fuera de control o uno que está "esperando" una entrada y recuperar el control ... incluso si ya no puedo acceder al indicador de entrada.

Soy un novato - ¿Cómo demonios depuran los programadores avanzados en los portátiles? ¿Seguramente no usan PDB con esta "bomba de tiempo"? ¡Comparte tus secretos! :)

+1

+1

+1

+1

¡Hasta!
Este problema ha sido un dolor para mí durante años cada vez que uso pdb y me olvido de dejar de fumar antes de volver a ejecutar la celda.

Creé una recompensa en BountySource. Quizás esto finalmente se arregle si podemos reunir suficiente dinero.
https://www.bountysource.com/issues/44958889-hang-after-running-pdb-in-a-cell-kernel-interrupt-doesn-t-help

+1

+1

Esto me ha vuelto loco durante años.

¿Qué tal si usas IPython.core.debugger.Pdb lugar?

from IPython.core.debugger import Pdb; Pdb().set_trace()

(O se puede usar %debug magic para depurar).

Ejecutar Pdb().set_trace() dos veces tiene el mismo problema.

Estoy investigando esto. La forma básica en que funcionan las interrupciones es que (en Unix) envían una señal al proceso, que luego genera KeyboardInterrupt.

Parece que hay varios problemas con esto:

  1. SIGINT no interrumpirá zeromq. Esto se soluciona con suerte por https://github.com/zeromq/pyzmq/pull/1368
  2. Incluso una vez que zeromq es interrumpible, creo que pdb tiene un montón de código de captura de KeyboardInterrupt que evita que se filtre. Esto quizás se pueda arreglar en IPython.core.debugger.Pdb .
  1. no es precisa, zeromq es interrumpido por SIGINT y genera KeyboardInterrupt, al menos a menos que el manejador SIGINT haya sido anulado.

@minrk tiene razón y yo estaba equivocado, lo siento.

Para obtener esta solución, es necesario que suceda lo siguiente:

¡¡Muchas gracias por investigar esto !!

Tan pronto como haya una nueva versión de IPykernel, esto se puede cerrar como fijo.

¡Hecho! Esto se puede cerrar.

import IPython
import ipykernel
print(IPython.__version__)
print(ipykernel.__version__)
IPython.core.debugger.set_trace()

7.15.0
5.3.0

`` 250 sys.stdout.flush ()
251
-> 252 def __call __ (self, result = None):
253 "" "Impresión con gestión de caché de historial.
254

--KeyboardInterrupt--
--KeyboardInterrupt--
''

KeyboardInterrupt parece no hacer nada en mi caso. ¿Es ese el comportamiento esperado?

Esperaría que eso interrumpiera. Veré si puedo reproducirme. Esto es Windows, ¿no?

macOS 10.15.5

Python 3.6.2 (default, May  4 2018, 19:40:30)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin

Oh, entonces esto no se esperaba. Avísame si hay alguna información que pueda agregar para aclarar.

lista de pips
`` `Versión del paquete


appnope 0.1.0
attrs 19.3.0
devolución de llamada 0.2.0
lejía 3.1.5
decorador 4.4.2
defusedxml 0.6.0
puntos de entrada 0.3
ipykernel 5.3.0
ipython 7.15.0
ipython-genutils 0.2.0
ipywidgets 7.5.1
jedi 0.17.1
Jinja2 2.11.2
jsonschema 3.2.0
jupyter 1.0.0
jupyter-client 6.1.3
jupyter-console 6.1.0
jupyter-core 4.6.3
MarkupSafe 1.1.1
mistune 0.8.4
nbconvert 5.6.1
nbformat 5.0.7
portátil 6.0.3
embalaje 20,4
pandocfilters 1.4.2
parso 0.7.0
pexpect 4.8.0
pickleshare 0.7.5
pip 20.0.2
prometheus-client 0.8.0
kit de herramientas de solicitud 3.0.5
ptyprocess 0.6.0
Pigmentos 2.6.1
pyparsing 2.4.7
pyrsistent 0.16.0
python-dateutil 2.8.1
pyzmq 19.0.1
qtconsole 4.7.5
QtPy 1.9.0
Send2Trash 1.5.0
setuptools 46.0.0
seis 1.15.0
terminado 0.8.3
testpath 0.4.4
tornado 6.0.4
rasgos 4.3.3
wcwidth 0.2.5
codificaciones web 0.5.1
rueda 0.34.2
widgetsnbextension 3.5.1```

Para mí, el problema también persistió después de la actualización. También en los nodos informáticos remotos de Linux que uso para trabajar, consulte:

import IPython
import ipykernel
import os
import platform

print(IPython.__version__)
print(ipykernel.__version__)
print(os.name,platform.system(),platform.release())
IPython.core.debugger.set_trace()

7.15.0
5.3.0
posix Linux 4.19.94-300.el7.x86_64

Actualmente trabaja en un entorno bastante voluminoso, por lo que no se puede descartar que algunas dependencias puedan estar causándolo. Puedo intentar ver si el error también se reproduce en un entorno mínimo si eso sería útil.

Esto necesita un maestro de IPykernel que aún no se ha lanzado.

¿Fue útil esta página
0 / 5 - 0 calificaciones