Как отладочные консоли реализованы в 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.
Ответ 3
http://docs.python.org/3.0/library/functions.html#input
http://docs.python.org/3.0/library/functions.html#eval
def start_interpreter():
while(True):
code = input("Python Console >")
eval(code)
Я уверен, однако, что их реализация намного более безумная, чем эта.
Ответ 4
Python имеет структуру отладки в bdb module. Я не уверен, что используемая вами среда IDE, но она, безусловно, позволяет реализовать полный отладчик Python с ней.
Ответ 5
Если вы хотите поэкспериментировать со своей собственной консолью Python, тогда это приятный старт:
cmd = None
while cmd != 'exit':
cmd = raw_input('>>> ')
try:
exec(cmd)
except:
print 'exception'
Но для реальной работы используйте InteractiveConsole.