如何在Python中实现调试控制台?

问题描述:

我见过一些Python IDE(例如PyDev Extensions,WingIDE),它们提供了一个调试控制台 - 一个交互式终端,它运行在断点所在方法的上下文中。这使您可以打印成员,调用其他方法并查看结果,并重新定义方法以尝试修复错误。凉。如何在Python中实现调试控制台?

谁能告诉我这是如何实现的?我知道有Code模块,它提供了一个InteractiveConsole类,但我不知道如何在当前加载的代码的上下文中运行它。我对Python很陌生,所以我们会很感激你的帮助!

对,我很惭愧地承认它实际上是在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() 

你可以试试看python调试器pdb。它就像gdb一样在使用它,但是在纯python中实现。在python安装目录中查找pdb.py。

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) 

我敢肯定,然而,其实施是远不止此foolsafe。

+0

是不是input()相当于eval(raw_input())? – 2009-01-15 00:44:33

Python在bdb module中有一个调试器框架。我不确定IDE的列表是否使用它,但肯定有可能用它来实现一个完整的Python调试器。

如果你想用自己的Python控制台试验,那么这是一个良好的开端:

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

但对于实际工作使用InteractiveConsole代替。