突出显示python堆栈跟踪

nkr*_*rkv 25 python debugging bash

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

所以我意识到我想要一些能够使堆栈轨迹着色并突出显示我的线条的东西.比较原始突出显示.

我可以写一个我可以用这种方式使用的python脚本:

nosetests | colorize_stack_trace.py
Run Code Online (Sandbox Code Playgroud)

但我相信使用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;
}
Run Code Online (Sandbox Code Playgroud)

现在我能做到:

nosetests 2>&1 | pyst
Run Code Online (Sandbox Code Playgroud)

不太优雅,但在某种程度上起作用.还有两个问题:

  1. 在测试完成之前我看不到任何输出.即我看不到进展.
  2. 我必须一遍又一遍地写2>&1.

UPD 2:

问我这个问题主要nosetests是考虑到了.我刚刚找到了很好的解决方案:rednose nose plugin.它突出了本地路径以及更多方便可读性的东西.

回到原始问题:我用supercat注意到的问题与它完全无关,但它是Unix shell流,刷新,管道,重定向的问题.因此,作为一个答案的问题我接受建议supercat答案.

tux*_*21b 24

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

所以,你所要做的就是:

$ easy_install pygments # downloads and installs pygments
$ cat traceback.txt | pygmentize -l pytb
Run Code Online (Sandbox Code Playgroud)

"pytb"是PythonTracebackLexer的快捷方式.还有一个包含Python 3 Tracebacks的特殊词法分析器,称为"py3tb".

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

Pygments控制台Traceback突出显示http://www.tux21b.org/public/pygments-pytb.png

您可以使用-f html选择另一个格式化程序(在这种情况下,HTML格式化程序).

  • 有没有办法让python神奇地着色回溯,而不用任何其他工具管道? (2认同)

Rot*_*eti 7

有一个很好的模块专门用于此目的:

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

pip install colored-traceback
Run Code Online (Sandbox Code Playgroud)

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

if DEBUG:
    import colored_traceback
    colored_traceback.add_hook()
Run Code Online (Sandbox Code Playgroud)

对于每个底层文件,您都会得到类似的回溯(颜色有所不同):

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
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 6

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

基于Dave Kirby对vim 建议,这类似于:

less -p regex file_name
Run Code Online (Sandbox Code Playgroud)

要么

some_command | less -p regex
Run Code Online (Sandbox Code Playgroud)