Abrir un shell de IPython en cualquier excepción (no detectada)
He definido el siguiente shell (incrustado) en Python:
from IPython.config.loader import Config
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = ' .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")
exit_msg = '**Leaving Nested interpreter'
from IPython.frontend.terminal.embed import InteractiveShellEmbed
ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)
Me gustaría que mi programa me coloque automáticamente en ese shell cuando haya una excepción,en el ámbito donde se produce la excepción.
Lo he intentado con:
def excepthook(type, value, traceback):
ipshell(msg)
sys.excepthook = excepthook
Pero esto no parece funcionar (solo obtengo el rastreo estándar). Además, idealmente sería mejor si:
IPython imprime el rastreo regulary entonces me cae en una cáscara de IPythonSi el código que escribí anteriormente funcionó, simplemente me dejaría caer en un shell de IPython y no imprimiría el rastreo.
Actualización 1:he leídoaquí que cuando se ejecuta el código desde IPython, IPython se encarga de detectar todas las excepciones, y que puede que no sea posible anular directamentesys.excepthook()
. Si este es el caso, ¿cómo puedo hacer que IPython ejecute otros ganchos de excepción (por ejemplo, miipshell()
) en el ámbito en el que se produce la excepción y después de que se imprime el rastreo?
Parece que hay un hilo en la lista de desarrolladores que discute esto:Comportamiento similar al de un imitador en ipython. Aparentemente hay una funciónset_custom_exc
eso se encarga de esto, pero no estoy seguro de cómo podría conectarlo a miipshell()
.