Выделение отслеживаний стека Python

Я работаю над довольно сложным проектом, и раз за разом я должен сузить проблемы, смотрящие на отслеживания стека. Они, оказывается, очень длинны и включают “мой” код, стандартный код библиотеки и сторонний код библиотек в то же время. Большую часть времени настоящая проблема находится в “моем” коде, и определение местоположения его немедленно в отслеживании стека немного трудно для глаз. В соответствии с “моим” кодом я имею в виду код, который находится под текущим рабочим каталогом.

Таким образом, я понял, что хочу что-то, что будет colorize отслеживания стека и выделять строки, которые являются моими. Сравните исходный с выделенным.

Я мог записать сценарий Python, что я мог использовать этот путь:

nosetests | colorize_stack_trace.py

Но я полагаю, что существует более быстрый и более изящный способ сделать это использование набор инструментов Linux. Какие-либо идеи?

UPD:

Используя суперкошку, предложенную Dennis Williamson, промежуточный результат следует за функцией удара:

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 завершится. Т.е. Я не вижу прогресса.
  2. Я должен записать 2> &1 много раз.

UPD 2:

При задавании этого вопроса я имел главным образом nosetests в памяти. И я просто нашел отличное решение: плагин носа rednose. Это выделяет пути, которые локальны плюс, делают намного более удобные вещи удобочитаемости.

Возврат исходному вопросу: проблемы, которые я отметил с суперкошкой, не касаются ее полностью, но это - проблема потоковой передачи оболочки Unix, сбрасывания, передачи по каналу, перенаправления. Таким образом, как, поскольку ответ на вопрос попросил, чтобы я принял ответ, который предлагает суперкошку.

25
задан nkrkv 1 March 2010 в 12:16
поделиться

5 ответов

Посмотрите на Supercat (spc). Он делает как ANSI, так и HTML подсветку и может быть настроен для вашего конкретного вывода. Он поставляется с некоторыми конфигурационными файлами для файлов исходного кода на C и Python, например, а также файлов журналов, Changelogs, diffs и других.

Основываясь на предложении Дэйва Кирби для vim, это делает что-то похожее:

less -p regex file_name

Или

some_command | less -p regex
6
ответ дан 28 November 2019 в 21:37
поделиться

Загружаем текст в vim:

nosetests | vim -

Устанавливаем vim на выделение всех строк, соответствующих поиску

:set hlsearch

Ищем строки с "вашим" путем

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

Вуаля - все строки с вашим путем будут выделены.

Если вы хотите выделить и следующую строку, то вы можете сделать и это:

/.*/path/to/my/code.*\n.*
-1
ответ дан 28 November 2019 в 21:37
поделиться

На самом деле существует отличная библиотека подсветки синтаксиса Python, которая называется Pygments , который также может выделять трассировки.

Итак, все, что вам нужно сделать, это:

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

"pytb" - это ярлык для PythonTracebackLexer. Также имеется специальный лексер для Python 3 Tracebacks, который называется "py3tb".

Вы можете форматировать вывод в различных форматах (включая html, latex, svg, несколько форматов изображений и так далее). Но есть также средство форматирования терминала (и, если вам интересно ... конечно, доступны разные цветовые темы!).

Вы можете использовать -f html , чтобы выбрать другое средство форматирования (в этом случае средство форматирования HTML).

24
ответ дан 28 November 2019 в 21:37
поделиться

Используется ли текстовое поле или TextInput?

TextInput отправляет событие Enter при нажатии клавиши Enter. Подробнее об этом можно узнать по адресу http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/controls/TextInput.html#event: введите

Я не уверен, как это работает для текстового поля.

-121--3221213-

Пока много хороших ответов. Вот просвет:

$ make 2>&1 | tee filetokeepitin.txt 

позволит вам наблюдать за прокручиванием выходных данных.

-121--1004010-

Возможно, вы могли бы использовать модуль cgitb (краткий официальный документ здесь ) в качестве отправной точки (он создает хорошие HTML-отслеживания). Внесение необходимых изменений (например, добавление цветового тэга в соответствии с путем к файлу) должно быть относительно простым. Но конечно это жизнеспособно, только если вы готовы использовать браузер для просмотра следов.

1
ответ дан 28 November 2019 в 21:37
поделиться

В качестве отправной точки для раскрашивания (и иного форматирования) текста вы, вероятно, захотите изучить библиотеку curses . Также см. это руководство , которое выглядит полезным.

Что касается переопределения встроенной обработки ошибок Python для всех программ ... Я никогда не пробовал, но думаю, что это потребует некоторых довольно низкоуровневых изменений. Вы всегда можете заключить свой код в огромный блок try / except, но я предполагаю, что вы не хотите этого делать. Я предпочитаю более Unixy-подход к написанию небольшого скрипта, который делает одно и делает это хорошо: он принимает входные данные и, если это трассировка стека, раскрашивает его. В противном случае передать текст без изменений. Лучше всего использовать трубку, как вы предложили. (В этом случае, чтобы передать stderr по конвейеру, вам нужно сделать что-то вроде этого, который объединяет stderr с stdout перед конвейером: cmd1 2> & 1 | cmd2 )

0
ответ дан 28 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: