突出显示 Python 堆栈跟踪

29 投票
9 回答
5032 浏览
提问于 2025-04-15 19:29

我正在做一个比较复杂的项目,时不时需要通过查看堆栈跟踪来缩小问题范围。堆栈跟踪通常很长,里面包含了“我的”代码、标准库的代码和第三方库的代码。大多数情况下,真正的问题出在“我的”代码上,但在堆栈跟踪中快速找到它有点难。这里的“我的”代码指的是当前工作目录下的代码。

所以我意识到我想要一些工具,可以给堆栈跟踪上色,并突出显示属于我的那部分代码。可以对比一下原始的高亮的

我可以写一个Python脚本来实现这个功能,像这样使用:

nosetests | colorize_stack_trace.py

但我觉得用Linux工具集有更快更优雅的方法。有没有什么好主意呢?

更新:

根据Dennis Williamson的建议,使用supercat,得到了以下的bash函数:

pyst() {
    rc=/tmp/spcrc;
    echo '#################### ### # # # ########################################' > $rc;
    echo '                     blk   0 r ^(.*)$' >> $rc;
    echo '                     mag b 0 r ^\s*File "'`pwd`'/(.*)"' >> $rc;
    spc -c $rc;
}

现在我可以这样做:

nosetests 2>&1 | pyst

虽然不太优雅,但在某种程度上是有效的。不过还有两个问题:

  1. 在nosetests完成之前,我看不到任何输出,也就是说我看不到进度。
  2. 我必须一次又一次地写2>&1。

更新 2:

提这个问题时,我主要是考虑nosetests。我刚刚找到一个很好的解决方案:rednose这个nose插件。它可以高亮本地路径,并且还有很多其他方便的可读性功能。

回到最初的问题:我提到的supercat的问题并不完全是它的错,而是Unix shell流、刷新、管道和重定向的问题。所以作为对提问的回答,我接受建议使用supercat的答案。

9 个回答

7

有一个很不错的模块专门用来做这个:

你只需要通过pip下载并安装它:

pip install colored-traceback

然后在你项目的顶层文件中导入它,比如这样:

if DEBUG:
    import colored_traceback
    colored_traceback.add_hook()

这样一来,对于每个出错的文件,你就能看到类似这样的错误追踪信息(颜色会有所不同):

Traceback (most recent call last):
  File "./workflowy.py", line 525, in <module>
    main()
  File "./workflowy.py", line 37, in main
    projects = cli.load_json(args, input_is_pipe)
  File "./workflowy.py", line 153, in load_json
    return json.load(sys.stdin)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 290, in load
    **kw)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
28

其实,有一个很棒的Python语法高亮库,叫做Pygments,它也能高亮显示错误追踪信息。

所以,你只需要做以下几步:

$ easy_install pygments # downloads and installs pygments
$ cat traceback.txt | pygmentize -l pytb

"pytb"是PythonTracebackLexer的快捷方式。它还包含一个专门用于Python 3错误追踪的解析器,叫做"py3tb"。

你可以把输出格式化成多种格式(包括html、latex、svg、几种图片格式等等)。另外,还有一个终端格式化工具(如果你在想...当然有不同的颜色主题可供选择!)。

你可以使用-f html来选择其他格式化工具(在这种情况下,就是HTML格式化工具)。

6

看看这个叫做 Supercat(简称spc)的工具。它可以对ANSI和HTML代码进行高亮显示,而且可以根据你的需求进行配置。它还附带了一些配置文件,可以用来处理C语言和Python的源代码文件,还有日志文件、变更日志、差异文件等。

这个工具是基于Dave Kirby对vim的建议,做了类似的功能:

less -p regex file_name

或者

some_command | less -p regex

撰写回答