突出显示python堆栈跟踪

时间:2010-02-19 14:40:24

标签: python debugging bash

我正在研究相当复杂的项目,一次又一次地缩小查看堆栈跟踪的问题。它们恰好很长,同时涉及“我的”代码,标准库代码和第三方库代码。大多数时候,真正的问题是在“我的”代码中并立即将其定位在堆栈跟踪中对于眼睛来说有点困难。在“我的”代码下,我指的是当前工作目录下的代码。

所以我意识到我想要的东西会使堆栈痕迹着色并突出显示我的线条。将originalhighlighted进行比较。

我可以写一个我可以这样使用的python脚本:

nosetests | colorize_stack_trace.py

但我相信使用Linux工具集有一种更快捷,更优雅的方法。有什么想法吗?

UPD:

使用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. 在测试完成之前,我看不到任何输出。即我没有看到进展。
  2. 我必须一遍又一遍地写2>& 1。
  3. UPD 2:

    问这个问题我主要考虑nosetests。我刚刚找到了很好的解决方案:rednose鼻子插件。它突出了本地的路径以及更多便利的可读性。

    回到原始问题:我在supercat中注意到的问题与它完全没有关系,但它是Unix shell流,刷新,管道,重定向的问题。因此,对于问题的答案,我接受一个暗示超级猫的答案。

8 个答案:

答案 0 :(得分:21)

实际上,有一个很棒的Python语法高亮库Pygments,它也能够突出回溯。

所以,你所要做的就是:

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

“pytb”是PythonTracebackLexer的快捷方式。 Python 3 Tracebacks还有一个特殊的词法分析器,叫做“py3tb”。

您可以使用各种格式(包括html,latex,svg,多种图像格式等)格式化输出。但也有一个终端格式化程序可能看起来像这样(如果你想知道......当然有不同的颜色主题可用!):

Pygments Console Traceback Highlighting http://www.tux21b.org/public/pygments-pytb.png

您可以使用-f html选择其他格式化程序(在这种情况下,HTML格式化程序)。

答案 1 :(得分:6)

看看Supercat(spc)。它同时执行ANSI和HTML突出显示,并且可以针对您的特定输出进行配置。它附带了一些C和Python源代码文件的配置文件,例如日志文件,更改日志,差异等。

基于 Dave Kirby的对vim的建议,这有类似之处:

less -p regex file_name

或者

some_command | less -p regex

答案 2 :(得分:1)

也许你可以使用cgitb模块(简短的官方文档here)作为起点(它创建了很好的HTML追溯)。进行所需的修改应该相对简单(例如,根据文件路径添加颜色标记)。但是,如果您愿意使用浏览器查看跟踪,这当然是可行的。

答案 3 :(得分:1)

有一个很好的模块就是为了这个目的:

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

pip install colored-traceback

将其导入项目的顶级文件,例如:

if DEBUG:
    import colored_traceback
    colored_traceback.add_hook()

对于每个underling文件(颜色各不相同),你会得到类似的回溯:

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

答案 4 :(得分:0)

作为着色(以及格式化)文本的起点,您可能希望查看curses library。另请参阅this how-to,这看起来很有用。

至于覆盖所有程序的Python内置错误处理......我从未尝试过,但我认为这会涉及一些相当低级别的更改。您总是可以将代码包装在一个巨大的try / except块中,但我认为您不希望这样做。我喜欢编写一个做一件事的小脚本的Unixy方法,并做得很好:让它接受一个输入,如果它是一个堆栈跟踪,就把它着色。否则,传递文本不变。像你建议的那样使用烟斗可能是最好的方法。 (在这种情况下,要管道stderr你想要做这样的事情,在管道之前将stderr与stdout合并:cmd1 2>&1 | cmd2

答案 5 :(得分:0)

您也可以使用:cfile命令使用vim打开traceback文件。然后,您可以使用:copen命令在回溯中打开突出显示的ant交互式文件列表,并使用一组相关的vim命令在这些文件之间跳转。

答案 6 :(得分:0)

这里是使用ipython的一个:

import sys
from IPython.core.ultratb import ColorTB
print(''.join(ColorTB().structured_traceback(*sys.exc_info())))

答案 7 :(得分:-1)

将文本加载到vim:

nosetests | vim -

设置vim以突出显示与搜索匹配的所有行

:set hlsearch

搜索包含“您的”路径的行

/.*/path/to/my/code.*

Voila - 将突​​出显示您路径的所有行。

如果你想突出显示下一行,那么你也可以这样做:

/.*/path/to/my/code.*\n.*