2010-07-22 4 views
8

Я хочу использовать возможности интроспекции python для отладки/разработки, но не могу найти подходящий инструмент для этого.Что является лучшим способом для интерактивной отладки в python?

Мне нужно войти в оболочку (например, IPython) в определенной позиции или в конкретном событии (например, исключение), причем локали и глобальные оболочки оболочки устанавливаются в кадры.

Мой собственный быстрый хак для иллюстрации:

import inspect 
from IPython.Shell import IPShellEmbed 
def run_debug(): 
    stack = inspect.stack() 
    frame = stack[1][0] 
    loc = frame.f_locals 
    glob = frame.f_globals 
    shell = IPShellEmbed() 
    shell(local_ns=loc, global_ns=glob) 

С по run_debug() вызова от 'точки останова' или попробовать/за исключением. Но, очевидно, для этого требуется много полирования, особенно для работы с потоковыми приложениями.

winpdb имеет точки останова с консолью, но я не нашел возможности быстро запустить из нее правильную оболочку python, и eval()/exec() не очень удобны для долгого отладки.

ответ

2

Для личных/образовательных целей вы можете использовать WingIDE - у них есть некоторые довольно прочные возможности отладки.

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

+0

Спасибо, их версия Pro действительно нуждается в функциональности, и она останавливает выполнение процесса перед запуском оболочек, поэтому потоковая передача не является проблемой. Довольно грустно, что его запатентовал, но, похоже, он получает то, за что вы платите. –

+0

Я предполагаю, что это одно из преимуществ взимания платы - они могут позволить себе нанимать людей и оплачивать их для работы над такими проблемами;) Конечно, если это слишком дорого, вы всегда можете осмотреться на местной конференции python и предложить им спросить Крыло для некоторых раздаточных копий. Они давали нам 3-4 каждый год, которые мы задавали, и все другие дела, которые я слышал с ними, были впечатляющими. –

0

PyScripter (FOSS) имеет довольно хороший отладчик, построенный в.

0

Если вы запустите свой код из ipython и нажмете на исключение, вы можете вызвать% debug afterwards, чтобы перейти в pdb за исключением. Это должно дать вам то, что вы хотите. Или если вы запустите ipython -pdb, вы автоматически будете сброшены в pdb, когда произойдет неперехваченное исключение.

3

Как у вас уже есть ipdb. Фактически, это pdb с оболочкой ipython (т. Е. Завершение вкладки, все различные магические функции и т. Д.).

Это фактически делает именно то, что маленький код, отрезанный вами в вашем вопросе, делает, но переносит его на простой вызов «ipdb.set_trace()».

+1

Да, это почти то, что мне нужно, но оно не очень хорошо работает с потоками, как и мой собственный пример. Когда я вызываю его из одного из дочерних потоков, другие все еще работают, изменяют данные, отправляют сообщения на остановленный поток и сохраняют вывод данных на консоль. –