Python-导入函数的局部变量

时间:2018-07-30 12:11:30

标签: python variables

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

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

感谢您的回答。

2 个答案:

答案 0 :(得分:5)

您基本上是在重新实现Python debugger pdb。如果您想走这条路,您可能要study the source codepdb本身是围绕较低级别bdb (basic debugger) modulesource code for that is also available的用户界面。

要回答您的直接问题:捕获异常时,您可以访问traceback object(通过exception.__traceback__sys.exc_info()),并且回溯访问本地和本地。通过tb_frame属性,堆栈中每个框架的全局名称空间。该属性设置为frame object,具有f_localsf_globals属性。

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

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

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

答案 1 :(得分:0)

“编写”“ DEBUGGER”功能的正确方法是:

import pdb
DEBUGGER = pdb.set_trace

现在,您可以在任意位置调用DEBUGGER(),您将处于一个交互式环境中,不仅可以访问本地变量,还可以访问整个调用堆栈,并且可以逐步执行其余代码(包括进入其他功能等),更改控制流以从另一行等继续执行等。

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