我见过几个提供调试控制台的 Python IDE(例如 PyDev Extensions、WingIDE)——一个在断点所在方法的上下文中运行的交互式终端。这使您可以打印成员、调用其他方法并查看结果,并重新定义方法以尝试修复错误。凉爽的。
谁能告诉我这是如何实现的?我知道有 Code 模块,它提供了一个 InteractiveConsole 类,但我不知道如何在当前加载的代码的上下文中运行它。我对 Python 还是很陌生,因此将不胜感激!
我见过几个提供调试控制台的 Python IDE(例如 PyDev Extensions、WingIDE)——一个在断点所在方法的上下文中运行的交互式终端。这使您可以打印成员、调用其他方法并查看结果,并重新定义方法以尝试修复错误。凉爽的。
谁能告诉我这是如何实现的?我知道有 Code 模块,它提供了一个 InteractiveConsole 类,但我不知道如何在当前加载的代码的上下文中运行它。我对 Python 还是很陌生,因此将不胜感激!
您可以尝试查看 python 调试器 pdb。它就像 gdb 在你如何使用它,但在纯 python 中实现。在您的 python 安装目录中查找 pdb.py。
是的,我很惭愧地承认它实际上在 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()
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)
但是,我敢肯定,它们的实现比这更安全。
Python 在bdb 模块中有一个调试器框架。我不确定您列出的 IDE 是否使用它,但当然可以使用它实现完整的 Python 调试器。
如果您想尝试自己的 Python 控制台,那么这是一个不错的开始:
cmd = None
while cmd != 'exit':
cmd = raw_input('>>> ')
try:
exec(cmd)
except:
print 'exception'
但对于实际工作,请改用 InteractiveConsole。