Раскраски исключения из Python на терминале [дубликат]
этот вопрос уже есть ответ здесь:
- выделение трассировок стека python 7 ответов
есть ли простой способ получить исключения, которое будет окрашено в командной строке? Например
def g(): f()
def f(): 1/0
g()
выдает ошибку
Traceback (most recent call last):
File "test.py", line 3, in <module>
g()
File "test.py", line 1, in g
def g(): f()
File "test.py", line 2, in f
def f(): 1/0
ZeroDivisionError: integer division or modulo by zero
Я хотел бы "целочисленное деление и остаток от деления на ноль " быть окрашенным или выделенным на терминале, чтобы я мог быстро выбрать его из длинной трассировки (только Linux). В идеале я бы не хотел писать пользовательский класс для каждого исключения, но каким-то образом улавливать и форматировать все виды.
EDIT: вопрос, связанный в комментариях, дает примеры того, как решить проблему с внешний программное обеспечение, но меня интересует внутреннее решение Python.
3 ответов
вы можете назначить пользовательские функции sys.excepthook
проводник. Функция вызывается всякий раз, когда есть без рук исключение (так что тот, который выходит из интерпретатора).
import sys
def myexcepthook(type, value, tb):
import traceback
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import TerminalFormatter
tbtext = ''.join(traceback.format_exception(type, value, tb))
lexer = get_lexer_by_name("pytb", stripall=True)
formatter = TerminalFormatter()
sys.stderr.write(highlight(tbtext, lexer, formatter))
sys.excepthook = myexcepthook
эта версия использует pygments
библиотека чтобы преобразовать текст обратной трассировки в один форматированный с раскраской ANSI, прежде чем писать его в stderr
.
нашел другой способ сделать это с помощью модуля IPython, который, вероятно, является зависимостью, которую все уже установили:
from IPython.core.ultratb import ColorTB
c = ColorTB()
exc = sys.exc_info()
print(''.join(c.structured_traceback(*exc)))
посмотреть colorama ( или любой другой расцветке ) модуль. Затем вы можете обернуть все приложение с помощью:
import traceback
from colorama import Fore, init
init( )
try:
// your app
except Exception:
print Fore.RED + traceback.format_exc( ) + Fore.RESET
// possibly raise again or log to db