debugging 突出显示python堆栈跟踪

yebdmbv4  于 2023-03-03  发布在  Python
关注(0)|答案(9)|浏览(150)

我正在做一个相当复杂的项目,一次又一次地我不得不通过查看堆栈跟踪来缩小问题的范围。它们碰巧很长,并且涉及到“我的”代码。标准库代码和第三方库代码。大多数时候真实的的问题是在“我的”代码中,在堆栈跟踪中立即定位它有点困难。在“我的”下我指的是当前工作目录下的代码。
所以我意识到我想要的东西,将着色堆栈跟踪和突出显示行是我的。比较originalhighlighted
我可以写一个python脚本,这样使用:

nosetests | colorize_stack_trace.py

但是我相信使用Linux工具集有一个更快更优雅的方法来完成这件事。

统一采购司:

使用Dennis威廉姆森建议的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完成之前,我看不到任何输出,也就是说,我看不到进程。
1.我不得不一遍又一遍地写2〉&1。

统一产品描述2:

问这个问题时,我脑子里想的主要是nosetests。我刚刚找到了很好的解决方案:rednose鼻子插件。它突出显示本地路径,并做了许多更方便的可读性的事情。
回到原来的问题:我注意到的supercat的问题并不完全与它有关,但它是Unix shell流,刷新,管道,重定向的问题。所以作为问题的答案,我接受一个建议supercat的答案。

56lgkhnf

56lgkhnf1#

实际上,有一个很棒的Python语法高亮库Pygments,它也能够高亮回溯。
所以,你要做的就是:

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

“pytb”是PythonTracebackLexer的快捷方式,还包括一个专门用于Python 3 Tracebacks的lexer,称为“py 3 tb”。
您可以将输出格式化为各种格式(包括html、latex、svg、几种图像格式等等)。但也有一个终端格式化程序可用(如果您想知道...当然有不同的颜色主题可用!)。
可以使用-f html选择另一个格式化程序(在这种情况下,选择HTML格式化程序)。

w8f9ii69

w8f9ii692#

看一下Supercat(spc),它可以突出显示ANSI和HTML,并且可以根据您的特定输出进行配置,它附带了一些C和Python源代码文件的配置文件,例如日志文件、Changelogs、diffs等。
基于Dave Kirby对vim的建议,下面的代码做了类似的事情:

less -p regex file_name

或者

some_command | less -p regex
tjjdgumg

tjjdgumg3#

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

你只需要通过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
js5cn81o

js5cn81o4#

也许你可以使用cgitb模块(简称官方文档here)作为起点(它创建了很好的HTML回溯)。它应该相对简单地做出你需要的修改(例如根据文件路径添加一个颜色标签)。但是当然,只有当你愿意使用浏览器查看追踪时,这才是可行的。

nhaq1z21

nhaq1z215#

下面是一个使用ipython的例子:

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

olhwl3o26#

作为对文本进行着色(或格式化)的起点,你可能想看看curses library,也可以看看this how-to,它看起来很有用。
至于覆盖Python内置的所有程序的错误处理......我从来没有尝试过,但我认为这会涉及一些相当低层次的更改。您可以始终将您的代码 Package 在一个巨大的try/except块中,但我假设您不想这样做。我更喜欢编写一个小脚本来做一件事的更统一的方法,并且做得很好:让它接受一个输入,如果它是一个堆栈跟踪,就给它着色。否则,就不加修改地传递文本。使用管道,就像您建议的那样,可能是最好的方法。(在这个例子中,要管道传输stderr,您需要做类似这样的事情,在管道传输之前将stderr与stdout合并:x1月1x)

u2nhd7ah

u2nhd7ah7#

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

jexiocij

jexiocij8#

另一个选择是使用better_exceptions。这给你颜色和更详细的堆栈跟踪信息。这比其他库如colored-traceback更好,因为它仍在开发中。从他们的自述文件中复制信息。
pip install better_exceptions
将BETTER_EXCEPTIONS环境变量设置为任意值:

export BETTER_EXCEPTIONS=1  # Linux / OSX
setx BETTER_EXCEPTIONS 1    # Windows

你就可以走了!
结果输出如下

dfuffjeb

dfuffjeb9#

将文本加载到vim中:

nosetests | vim -

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

:set hlsearch

搜索具有“您的”路径的行

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

瞧-所有与您的路径线将突出显示。
如果你想突出显示下一行,那么你也可以这样做:

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

相关问题