我最大的问题是花哨的 IPython 异常。我希望它们看起来像普通的 python 异常,但是当我尝试重置时sys.excepthook
它不起作用:
In [31]: import sys; sys.excepthook = sys.__excepthook__; (sys.excepthook, sys.__excepthook__)
Out[31]:
(<bound method TerminalInteractiveShell.excepthook of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x27c8e10>>,
<function sys.excepthook>)
Run Code Online (Sandbox Code Playgroud)
sys.excepthook
每次执行一行代码时,IPython 都会进行替换,因此每次更改它都毫无意义。除此之外,IPython 捕获所有异常并自行处理它们,而无需调用sys.excepthook
.
This answer to a related question提供了一种覆盖此行为的方法:基本上,您必须showtraceback
使用一个可以按照您希望的方式格式化和显示异常的函数来覆盖Ipython的函数。
def showtraceback(self):
traceback_lines = traceback.format_exception(*sys.exc_info())
del traceback_lines[1]
message = ''.join(traceback_lines)
sys.stderr.write(message)
import sys
import traceback
import IPython
IPython.core.interactiveshell.InteractiveShell.showtraceback = showtraceback
Run Code Online (Sandbox Code Playgroud)