Как отладочные консоли реализованы в Python?

Я видел пару Python IDE (например, PyDev Extensions, WingIDE), которые предоставляют консоль отладки - интерактивный терминал, который работает в контексте метода, в котором находится точка останова. Это позволяет печатать элементы, вызывать другие методы и просматривать результаты, а также переопределять методы для исправления ошибок. Круто.

Может ли кто-нибудь сказать мне, как это реализовано? Я знаю там модуль кода, который предоставляет класс InteractiveConsole, но я не знаю, как это можно запустить в контексте загружаемого кода. Я новичок в Python, поэтому нежная помощь будет оценена!

Ответ 1

Право, мне стыдно признаться, что это действительно в документации для InteractiveConsole в конце концов. Вы можете запустить его в локальном контексте, передав результат функции locals() в конструктор InteractiveConsole. Я не смог найти способ закрыть InteractiveConsole, не убивая приложение, поэтому я расширил его, чтобы просто закрыть консоль, когда он ловит исключение SystemExit. Мне это не нравится, но я еще не нашел лучшего способа.

Вот несколько (довольно тривиальный) пример кода, демонстрирующий консоль отладки.

import code

class EmbeddedConsole(code.InteractiveConsole):
    def start(self):
        try:
            self.interact("Debug console starting...")
        except:
            print("Debug console closing...")

def print_names():
    print(adam)
    print(bob)

adam = "I am Adam"
bob = "I am Bob"

print_names()
console = EmbeddedConsole(locals())
console.start()
print_names()

Ответ 2

Вы можете попробовать посмотреть pdb debugger pdb. Это как gdb в том, как вы его используете, но реализовано в чистом питоне. Найдите pdb.py в каталоге установки python.

Ответ 4

Python имеет структуру отладки в bdb module. Я не уверен, что используемая вами среда IDE, но она, безусловно, позволяет реализовать полный отладчик Python с ней.

Ответ 5

Если вы хотите поэкспериментировать со своей собственной консолью Python, тогда это приятный старт:

cmd = None
while cmd != 'exit':
    cmd = raw_input('>>> ')
    try:
        exec(cmd)
    except:
        print 'exception'

Но для реальной работы используйте InteractiveConsole.