Открытие оболочки IPython для любого (необработанного) исключения
Я определил следующую (встроенную) оболочку в 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)
Я хотел бы, чтобы моя программа автоматически помещала меня в эту оболочку всякий раз, когда есть исключение,в области, где происходит исключение.
Я пробовал с:
def excepthook(type, value, traceback):
ipshell(msg)
sys.excepthook = excepthook
Но это, похоже, не работает (я просто получаю стандартную трассировку). Кроме того, в идеале было бы лучше, если бы:
IPython печатает обычную трассировкуа потом бросает меня в оболочку IPythonЕсли код, который я написал выше, сработает, он просто поместит меня в оболочку IPython, а не выведет трассировку.
Обновление 1:я прочиталВот что при запуске кода из IPython IPython отвечает за перехват всех исключений, и что может быть невозможно напрямую переопределитьsys.excepthook()
, Если это так, как я могу заставить IPython выполнять другие ловушки исключений (например, мойipshell()
) в области, где возникает исключение, и после того, как оно печатает след?
Кажется, в списке разработчиков есть ветка, обсуждающая это:похожее на крючок поведение в ipython, Есть видимо функцияset_custom_exc
это заботится об этом, но я не уверен, как я мог бы подключить это к моейipshell()
.