[英]Coloring exceptions from Python on a terminal
有没有一种简单的方法可以使异常消息在命令行上显示颜色? 例如
def g(): f()
def f(): 1/0
g()
给出错误
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
我希望在终端上对“ 整数除法或以零为模 ”进行着色或突出显示,以便我可以快速地从长回溯中选择它(仅限Linux)。 理想情况下,我不想为每个Exception编写自定义类,而是以某种方式捕获并格式化所有类型。
编辑:注释中链接的问题提供了有关如何使用外部软件解决问题的示例,但我对内部Python解决方案感兴趣。
您可以将自定义函数分配给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()
此版本使用pygments
库将回溯文本转换为使用ANSI着色格式的文本,然后再将其写入stderr
。
有人将其变成了一个项目,该项目可以检测终端支持并允许您设置pygments样式,请参阅colored-traceback.py
。
找到了另一种使用IPython模块执行此操作的方法,该模块可能是每个人都已经安装的依赖项:
from IPython.core.ultratb import ColorTB
c = ColorTB()
exc = sys.exc_info()
print(''.join(c.structured_traceback(*exc)))
看一下colorama (或任何其他着色)模块。 然后,您可以使用以下方法包装整个应用程序:
import traceback
from colorama import Fore, init
init( )
try:
// your app
except Exception:
print Fore.RED + traceback.format_exc( ) + Fore.RESET
// possibly raise again or log to db
这将共享@freakish解决方案,并使着色成为异常的一部分,而不是要求用户为每个异常消息添加颜色。 显然,它仅适用于自定义异常,因此它可能与OP所寻找的不完全相同。
from colorama import Fore, init
init()
class Error (Exception):
def __init__ (self, message):
super().__init__(Fore.RED + message)
class BadConfigFile (Error):
pass
raise BadConfigFile("some error message")
这将以红色显示“某些错误消息”的回溯。 将“错误”作为基类意味着您可以创建其他所有异常,这些异常都将继承消息的颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.