让 IPython 看起来像一个普通的 python shell

fak*_*ake 2 python ipython

我最大的问题是花哨的 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)

cs9*_*s95 6

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)