我正在研究相当复杂的项目,一次又一次地缩小查看堆栈跟踪的问题。它们恰好很长,同时涉及“我的”代码,标准库代码和第三方库代码。大多数时候,真正的问题是在“我的”代码中并立即将其定位在堆栈跟踪中对于眼睛来说有点困难。在“我的”代码下,我指的是当前工作目录下的代码。
所以我意识到我想要的东西会使堆栈痕迹着色并突出显示我的线条。将original与highlighted进行比较。
我可以写一个我可以这样使用的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
不太优雅,但在某种程度上有效。还有两个问题:
UPD 2:
问这个问题我主要考虑nosetests
。我刚刚找到了很好的解决方案:rednose鼻子插件。它突出了本地的路径以及更多便利的可读性。
回到原始问题:我在supercat中注意到的问题与它完全没有关系,但它是Unix shell流,刷新,管道,重定向的问题。因此,对于问题问的答案,我接受一个暗示超级猫的答案。
答案 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.*