2010-02-19 6 views
20

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

Итак, я понял, что хочу что-то, что будет раскрашивать трассировки стека и выделить линии, которые являются моими. Сравнить original до highlighted.

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

nosetests | colorize_stack_trace.py 

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

UPD:

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

UPD 2:

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

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

+0

RedNose приятно. Вы можете включить его по умолчанию, добавив 'rednose = 1' в ваш' .noserc' –

ответ

6

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

основе предложение Дэйва Кирби для Vim, это делает что-то подобное:

less -p regex file_name 

Или

some_command | less -p regex 
1

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

+0

Спасибо за подсказку, но немного странно использовать браузер для просмотра результатов теста. Пахнет сценарием действий и QUit. Не так гибко, как может быть :) – nkrkv

+0

@nailxx Возможно, вам стоит взглянуть на это дальше. Из официального документа: «Первоначально он был предназначен для отображения обширной информации о трассировке в HTML для сценариев CGI. Позднее было обобщено также отображение этой информации в виде простого текста. « –

0

В качестве отправной точки для раскраски (и форматирования текста) вы, вероятно, захотите посмотреть на curses library. Также см. this how-to, что выглядит полезным.

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

-1

Загрузите текст в Vim:

nosetests | vim - 

Набор ВИМ для выделите все строки, соответствующие запросу

:set hlsearch 

Поиск линий «ваш» путь

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

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

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

/.*/path/to/my/code.*\n.* 
20

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

Таким образом, все, что вам нужно сделать, это:

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

"pytb" является ярлык для PythonTracebackLexer. Существует также специальный лексер для Python 3 Tracebacks, который называется «py3tb».

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

Pygments Console Traceback Highlighting http://www.tux21b.org/public/pygments-pytb.png

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

С уважением,
Christoph

+0

Прохладный вариант, может быть хорошей альтернативой spc – nkrkv

+0

+1 для Pygments. Это Пчелиные колени. – jathanism

+2

Есть ли какой-либо способ для python для красивой трассировки трассировки волшебным образом, без каких-либо проблем с любым другим инструментом? – azmeuk

0

Также вы можете открыть файл с Vim обратного прослеживания, используя :cfile команды. Затем вы можете открыть выделенный ant интерактивный список файлов в traceback с помощью команды :copen и перепрыгнуть между этими файлами, используя набор связанных команд vim.

0

Существует хороший модуль только для этой цели:

Вам просто нужно скачать и установить его с помощью пип:

pip install colored-traceback 

Импорт это в файл верхнего уровня вашего проекта, для exmapl е так:

if DEBUG: 
    import colored_traceback 
    colored_traceback.add_hook() 

И вы получите отслеживающий, как, что для каждого файла сошки (цвета варьируются):

Traceback (most recent call last): 
    File "./workflowy.py", line 525, in <module> 
    main() 
    File "./workflowy.py", line 37, in main 
    projects = cli.load_json(args, input_is_pipe) 
    File "./workflowy.py", line 153, in load_json 
    return json.load(sys.stdin) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 290, in load 
    **kw) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 383, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 
Смежные вопросы