Python - 导入函数的局部变量

3

我正在尝试创建一个调试器函数,当发生错误时调用该函数,让我可以访问控制台以便检查程序中发生的情况。 以下是基本功能:

def DEBUGGER(error):
    print(error)
    print("[DEBUGGER] Your program has failed, here is the debugger. Enter EXIT to end program.")
    while True:
        line = input(">>> ").lower()
        if line == 'exit':
            sys.exit(0)
        else:
            try:
                exec(line)
            except Exception as e:
                print(str(e))

问题在于我无法输入像print(var)这样的内容,因为它在另一个函数中被引用。 全局函数对我没有帮助,因为我想能够调用程序中的任何变量,但我不能将它们全部设为全局变量。我知道可以通过将所有函数放入类中来解决它,但由于许多原因我不能这样做。
有没有一种方法可以获取运行函数的局部变量?(当我调用DEBUGGER()时,母函数仍在运行)
如果没有,我能否导出当前函数的局部变量并将其作为参数传递给DEBUGGER()
感谢您的回答。

1
locals() 怎么样? - midor
2
此外,Python 还有一个完整的 pdb 模块专门用于这种调试。您不想使用它的特殊原因是什么? - Green Cloak Guy
2
你可能可以使用traceback模块来完成这个任务,但是为什么要这样做呢?Python已经内置了调试器pdb - Daniel Roseman
2个回答

5
你基本上是在重新实现 Python 调试器 pdb。如果你想这样做,可能需要 研究源代码pdb 本身是围绕更低级别的 bdb(基本调试器)模块 构建的用户界面,该模块的源代码也可用

回答您的直接问题:当您捕获异常时,您可以访问traceback对象(通过exception.__traceback__或通过sys.exc_info()),并且跟踪回溯可以通过tb_frame属性访问堆栈中每个帧的本地和全局命名空间。该属性设置为frame对象,它具有f_localsf_globals属性。

bdb.Bdb.get_stack()方法可以作为如何处理回溯的有趣示例,内部pdb.Pdb._select_frame()方法用于从堆栈中选择一个帧以使用局部变量和全局变量。

如果您不想重新实现完整的调试器,可以使用pdb.pm()pdb.post_mortem()函数。这些函数接受最后引发的回溯,并让您在交互式环境中检查堆栈帧:

try:
    exec(line)
except Exception as e:
    pdb.post_mortem(e.__traceback__)

0

编写“DEBUGGER”函数的正确方式是:

import pdb
DEBUGGER = pdb.set_trace

现在你可以在任何地方调用DEBUGGER(),你将进入一个交互式环境,不仅可以访问本地变量,还可以访问整个调用堆栈,并能够逐步执行剩余的代码(包括进入其他函数等),改变控制流以从另一行继续执行等等等等。

哦,是的:当然你也可以只写import pdb; pdb.set_trace() ;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接