Как лучше всего использовать интерактивную отладку в 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 () из точки останова или попробуйте / except. Но, очевидно, это требует большой доработки, особенно для правильной работы с многопоточными приложениями.

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


person Daniel Kluev    schedule 22.07.2010    source источник


Ответы (3)


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

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

person Wayne Werner    schedule 22.07.2010
comment
Спасибо, их версия Pro действительно имеет необходимые функции и останавливает выполнение процесса перед запуском оболочки, поэтому многопоточность не проблема. Довольно печально, что это проприетарный продукт, но, похоже, это тот случай, когда вы получаете то, за что платите. - person Daniel Kluev; 23.07.2010
comment
Думаю, это одно из преимуществ взимания платы - они могут позволить себе нанять людей и заплатить им за работу над подобными проблемами;) Конечно, если это слишком дорого, вы всегда можете поискать местную конференцию Python и предложить им попросить Wing дать бесплатные копии. Они давали нам по 3-4 каждого года, о которых мы просили, и все остальные сделки, которые я слышал с ними, были впечатляющими. - person Wayne Werner; 23.07.2010

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

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

person Joe Kington    schedule 22.07.2010
comment
Да, это почти то, что мне нужно, но это плохо работает с потоками, как мой собственный пример. Когда я вызываю его из одного из дочерних потоков, другие все еще работают, изменяя данные, отправляя сообщения остановленному потоку и сохраняя вывод данных на консоль. - person Daniel Kluev; 23.07.2010

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

person macedoine    schedule 22.07.2010