首页 > 解决方案 > Python - 导入函数的局部变量

问题描述

我正在尝试创建一个调试器函数,当出现错误时调用该函数,并让我访问控制台,以便检查程序中发生了什么。这是基本功能:

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()吗?

感谢您的回答。

标签: pythonvariables

解决方案


您基本上是在重新实现Python 调试器pdb。如果你想走这条路,你可能想研究源代码pdb它本身是一个围绕低级bdb(基本调试器)模块的用户界面,并且它的源代码也是可用的

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

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

如果您不想重新实现完整的调试器,可以使用pdb.pm()orpdb.port_mortem()函数。这些获取最后一次提出的回溯,并让您在交互式环境中检查堆栈帧:

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

推荐阅读