突出显示 Python 堆栈跟踪
我正在做一个比较复杂的项目,时不时需要通过查看堆栈跟踪来缩小问题范围。堆栈跟踪通常很长,里面包含了“我的”代码、标准库的代码和第三方库的代码。大多数情况下,真正的问题出在“我的”代码上,但在堆栈跟踪中快速找到它有点难。这里的“我的”代码指的是当前工作目录下的代码。
所以我意识到我想要一些工具,可以给堆栈跟踪上色,并突出显示属于我的那部分代码。可以对比一下原始的和高亮的。
我可以写一个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
虽然不太优雅,但在某种程度上是有效的。不过还有两个问题:
- 在nosetests完成之前,我看不到任何输出,也就是说我看不到进度。
- 我必须一次又一次地写2>&1。
更新 2:
提这个问题时,我主要是考虑nosetests
。我刚刚找到一个很好的解决方案:rednose这个nose插件。它可以高亮本地路径,并且还有很多其他方便的可读性功能。
回到最初的问题:我提到的supercat的问题并不完全是它的错,而是Unix shell流、刷新、管道和重定向的问题。所以作为对提问的回答,我接受建议使用supercat的答案。
9 个回答
有一个很不错的模块专门用来做这个:
你只需要通过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
其实,有一个很棒的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格式化工具)。
看看这个叫做 Supercat(简称spc)的工具。它可以对ANSI和HTML代码进行高亮显示,而且可以根据你的需求进行配置。它还附带了一些配置文件,可以用来处理C语言和Python的源代码文件,还有日志文件、变更日志、差异文件等。
这个工具是基于Dave Kirby对vim的建议,做了类似的功能:
less -p regex file_name
或者
some_command | less -p regex