Otwieranie powłoki IPython na dowolnym (niezłapanym) wyjątku
Zdefiniowałem następującą (osadzoną) powłokę w Pythonie:
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)
Chciałbym, aby mój program automatycznie umieszczał mnie w tej powłoce, gdy tylko wystąpi wyjątekw zakresie, w którym występuje wyjątek.
Próbowałem z:
def excepthook(type, value, traceback):
ipshell(msg)
sys.excepthook = excepthook
Ale to nie wydaje się działać (po prostu dostaję standardowy ślad). Ponadto najlepiej byłoby, gdyby:
IPython drukuje regularne śledzeniei wtedy wrzuca mnie do powłoki IPythonaJeśli kod, który napisałem powyżej, zadziałał, po prostu wrzuciłby mnie do powłoki IPythona i nie wydrukował traceback.
Aktualizacja 1:przeczytałemtutaj że uruchamiając kod z IPython, IPython jest odpowiedzialny za przechwytywanie wszystkich wyjątków i może nie być możliwe bezpośrednie nadpisaniesys.excepthook()
. Jeśli tak jest, w jaki sposób mogę mieć IPythona do wykonania innych przechwyceń wyjątków (np. Mójipshell()
) w zakresie, w którym występuje wyjątek i po wydrukowaniu śledzenia?
Wydaje się, że wątek na liście dev omawia ten temat:oprócz zachowania typu hook w ipythonie. Najwyraźniej istnieje funkcjaset_custom_exc
to się zajmuje, ale nie jestem pewien, jak mogę to podłączyć do mojegoipshell()
.