python: traceback.print_stack(): 如何着色和重新格式化输出
python: traceback.print_stack(): How to colorize and reformat output
我想查看代码到特定点的完整轨迹
我也是
...
import traceback
traceback.print_stack()
...
然后会显示
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()
如何使用 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()))
同样如何使用 traceback.print_stack()
我使用的答案基于 Alexander Huszagh
1) 我们必须使用 Python3TracebackLexer
2) 我们必须使用 traceback.format_stack()
,它给出 list
,然后使用 ''.join(traceback.format_stack())
.
将它们连接为 string
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)
Pygments 列出了可用的 lexers。您可以使用 Python3TracebackLexer 执行此操作。
from pygments import highlight
from pygments.lexers import Python3TracebackLexer
from pygments.formatters import TerminalTrueColorFormatter
err_str = '''
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()
'''
print(highlight(err_str, Python3TracebackLexer(), TerminalTrueColorFormatter()))
为了获得 err_str
,请将 print_stack
替换为 format_stack
,如下所示:
def colorize_traceback(err_str):
return highlight(err_str, Python3TracebackLexer(), TerminalTrueColorFormatter())
try:
... # Some logic
except Exception: # Or a more narrow exception
# tb.print_stack()
print(colorize_traceback(tb.format_stack()))
或者,使用 rich 库。
With just two lines of code,它会美化你的回溯......然后是一些!
from rich.traceback import install
install()
后来怎么样了?看一眼:
还有它的美丽之处? It supports Pygment themes!
我想查看代码到特定点的完整轨迹
我也是
...
import traceback
traceback.print_stack()
...
然后会显示
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()
如何使用 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()))
同样如何使用 traceback.print_stack()
我使用的答案基于 Alexander Huszagh
1) 我们必须使用 Python3TracebackLexer
2) 我们必须使用 traceback.format_stack()
,它给出 list
,然后使用 ''.join(traceback.format_stack())
.
string
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)
Pygments 列出了可用的 lexers。您可以使用 Python3TracebackLexer 执行此操作。
from pygments import highlight
from pygments.lexers import Python3TracebackLexer
from pygments.formatters import TerminalTrueColorFormatter
err_str = '''
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()
'''
print(highlight(err_str, Python3TracebackLexer(), TerminalTrueColorFormatter()))
为了获得 err_str
,请将 print_stack
替换为 format_stack
,如下所示:
def colorize_traceback(err_str):
return highlight(err_str, Python3TracebackLexer(), TerminalTrueColorFormatter())
try:
... # Some logic
except Exception: # Or a more narrow exception
# tb.print_stack()
print(colorize_traceback(tb.format_stack()))
或者,使用 rich 库。
With just two lines of code,它会美化你的回溯......然后是一些!
from rich.traceback import install
install()
后来怎么样了?看一眼:
还有它的美丽之处? It supports Pygment themes!