代码之家  ›  专栏  ›  技术社区  ›  TarkaDaal

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

  •  11
  • TarkaDaal  · 技术社区  · 17 年前

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

    有人能告诉我这是如何实现的吗?我知道有一个Code模块,它提供了一个InteractiveConsole类,但我不知道如何在当前加载的代码上下文中运行它。我是Python新手,非常感谢您的帮助!

    5 回复  |  直到 17 年前
        1
  •  6
  •   John Fouhy    17 年前

    您可以尝试查看python调试器pdb。它在使用方式上类似于gdb,但用纯python实现。在python安装目录中查找pdb.py。

        2
  •  3
  •   TarkaDaal    17 年前

    好吧,我很惭愧地承认,毕竟它确实在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()
    
        3
  •  2
  •   Oliver N.    17 年前

    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
  •  1
  •   Kamil Kisiel    17 年前

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

        5
  •  0
  •   compie Artelius    16 年前

    如果你想尝试自己的Python控制台,那么这是一个很好的开始:

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

    但对于实际工作,请使用InteractiveConsole。