Как консоли отладки реализованы в Python? - PullRequest
10 голосов
/ 14 января 2009

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

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

Ответы [ 5 ]

6 голосов
/ 15 января 2009

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

3 голосов
/ 15 января 2009

Правильно, мне стыдно признаться, что это на самом деле в документации к 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 голосов
/ 15 января 2009

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)

Однако я уверен, что их реализация намного более безрассудна, чем эта.

0 голосов
/ 26 января 2010

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

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

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

0 голосов
/ 15 января 2009

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

...