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 IPython

Si 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?

Actualización 2:

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().

Respuestas a la pregunta(2)

Su respuesta a la pregunta