python:traceback.print_stack():如何对输出进行着色和重新格式化

San*_*idi 4 python pretty-print traceback

我想查看代码直到特定点的完整跟踪

所以我这样做

...
import traceback
traceback.print_stack()
...
Run Code Online (Sandbox Code Playgroud)

然后就会显示

  File ".venv/lib/python3.7/site-packages/django/db/models/query.py", line 144, in __iter__
    return compiler.results_iter(tuple_expected=True, chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File ".venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1052, in results_iter
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File ".venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1100, in execute_sql
    cursor.execute(sql, params)
  File ".venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 110, in execute
    extra={'duration': duration, 'sql': sql, 'params': params}
  File "/usr/lib64/python3.7/logging/__init__.py", line 1371, in debug
    self._log(DEBUG, msg, args, **kwargs)
  File "/usr/lib64/python3.7/logging/__init__.py", line 1519, in _log
    self.handle(record)
  File "/usr/lib64/python3.7/logging/__init__.py", line 1528, in handle
    if (not self.disabled) and self.filter(record):
  File "/usr/lib64/python3.7/logging/__init__.py", line 762, in filter
    result = f.filter(record)
  File "basic_django/settings.py", line 402, in filter
    traceback.print_stack()
Run Code Online (Sandbox Code Playgroud)

如何使用 pygments 使输出更加丰富多彩。

通常我会在 python 中对 json 字符串进行着色

from pygments import highlight
from pygments.lexers import JsonLexer
from pygments.formatters import TerminalTrueColorFormatter
json_str = '{ "name":"John" }'
print(highlight(json_str, JsonLexer(), TerminalTrueColorFormatter()))
Run Code Online (Sandbox Code Playgroud)

同样如何做到这一点traceback.print_stack()

我根据 Alexander Huszagh 使用的答案

1)我们必须使用Python3TracebackLexer

2)我们必须使用traceback.format_stack()which 给出 a list,然后将它们连接为stringusing ''.join(traceback.format_stack())

import traceback
import pygments
from pygments.lexers import Python3TracebackLexer
from pygments.formatters import TerminalTrueColorFormatter
traceback_color = pygments.highlight(''.join(traceback.format_stack()),Python3TracebackLexer(),TerminalTrueColorFormatter(style='trac')) # trac or rainbow_dash i prefer
print(traceback_color)
Run Code Online (Sandbox Code Playgroud)

pep*_*uan 6

或者,使用丰富的库。

只需两行代码,它就会美化您的回溯......然后是一些!

from rich.traceback import install
install()
Run Code Online (Sandbox Code Playgroud)

之后看起来怎么样?看一下:

出色的回溯输出

以及它的美丽之处?它支持 Pygment 主题