在终端上为Python着色异常

Hoo*_*ked 10 python exception colors

是否有一种简单的方法可以在命令行上显示异常消息?例如

def g():    f()
def f():    1/0
g()
Run Code Online (Sandbox Code Playgroud)

给出错误

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    g()
  File "test.py", line 1, in g
    def g():    f()
  File "test.py", line 2, in f
    def f():    1/0
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)

我希望在终端上对" 整数除法或模数为零 "进行着色或突出显示,以便我可以快速从长时间回溯中选择它(仅限Linux).理想情况下,我不想为每个Exception编写一个自定义类,但不知何故捕获并格式化所有类型.

编辑:评论中链接的问题提供了如何使用外部软件解决问题的示例,但我对内部Python解决方案感兴趣.

Mar*_*ers 11

您可以为sys.excepthook处理程序分配自定义函数.只要存在未处理的异常(因此退出解释器的异常),就会调用该函数.

def set_highlighted_excepthook():
    import sys, traceback
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name
    from pygments.formatters import TerminalFormatter

    lexer = get_lexer_by_name("pytb" if sys.version_info.major < 3 else "py3tb")
    formatter = TerminalFormatter()

    def myexcepthook(type, value, tb):
        tbtext = ''.join(traceback.format_exception(type, value, tb))
        sys.stderr.write(highlight(tbtext, lexer, formatter))

    sys.excepthook = myexcepthook

set_highlighted_excepthook()
Run Code Online (Sandbox Code Playgroud)

在将其写入之前,此版本使用pygments将回溯文本转换为使用ANSI着色格式化的文本stderr.


pos*_*ich 5

使用 IPython 模块找到了另一种方法,这可能是每个人都已经安装的依赖项:

from IPython.core.ultratb import ColorTB
c = ColorTB()
exc = sys.exc_info()
print(''.join(c.structured_traceback(*exc)))
Run Code Online (Sandbox Code Playgroud)