Я работаю над довольно сложным проектом, и раз за разом я должен сузить проблемы, смотрящие на отслеживания стека. Они, оказывается, очень длинны и включают “мой” код, стандартный код библиотеки и сторонний код библиотек в то же время. Большую часть времени настоящая проблема находится в “моем” коде, и определение местоположения его немедленно в отслеживании стека немного трудно для глаз. В соответствии с “моим” кодом я имею в виду код, который находится под текущим рабочим каталогом.
Таким образом, я понял, что хочу что-то, что будет 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
Не слишком изящный, но работы над определенной степенью. Существует две оставленные проблемы:
UPD 2:
При задавании этого вопроса я имел главным образом nosetests
в памяти. И я просто нашел отличное решение: плагин носа rednose. Это выделяет пути, которые локальны плюс, делают намного более удобные вещи удобочитаемости.
Возврат исходному вопросу: проблемы, которые я отметил с суперкошкой, не касаются ее полностью, но это - проблема потоковой передачи оболочки Unix, сбрасывания, передачи по каналу, перенаправления. Таким образом, как, поскольку ответ на вопрос попросил, чтобы я принял ответ, который предлагает суперкошку.
Посмотрите на Supercat (spc). Он делает как ANSI, так и HTML подсветку и может быть настроен для вашего конкретного вывода. Он поставляется с некоторыми конфигурационными файлами для файлов исходного кода на C и Python, например, а также файлов журналов, Changelogs, diffs и других.
Основываясь на предложении Дэйва Кирби для vim, это делает что-то похожее:
less -p regex file_name
Или
some_command | less -p regex
Загружаем текст в vim:
nosetests | vim -
Устанавливаем vim на выделение всех строк, соответствующих поиску
:set hlsearch
Ищем строки с "вашим" путем
/.*/path/to/my/code.*
Вуаля - все строки с вашим путем будут выделены.
Если вы хотите выделить и следующую строку, то вы можете сделать и это:
/.*/path/to/my/code.*\n.*
На самом деле существует отличная библиотека подсветки синтаксиса 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).
Используется ли текстовое поле или 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-отслеживания). Внесение необходимых изменений (например, добавление цветового тэга в соответствии с путем к файлу) должно быть относительно простым. Но конечно это жизнеспособно, только если вы готовы использовать браузер для просмотра следов.
В качестве отправной точки для раскрашивания (и иного форматирования) текста вы, вероятно, захотите изучить библиотеку curses . Также см. это руководство , которое выглядит полезным.
Что касается переопределения встроенной обработки ошибок Python для всех программ ... Я никогда не пробовал, но думаю, что это потребует некоторых довольно низкоуровневых изменений. Вы всегда можете заключить свой код в огромный блок try / except, но я предполагаю, что вы не хотите этого делать. Я предпочитаю более Unixy-подход к написанию небольшого скрипта, который делает одно и делает это хорошо: он принимает входные данные и, если это трассировка стека, раскрашивает его. В противном случае передать текст без изменений. Лучше всего использовать трубку, как вы предложили. (В этом случае, чтобы передать stderr по конвейеру, вам нужно сделать что-то вроде этого, который объединяет stderr с stdout перед конвейером: cmd1 2> & 1 | cmd2
)