在Python中,如何获取当前帧?

cho*_*ida 26 python

在其他语言中,我可以通过反射api获取当前帧,以确定哪些变量是我当前所在范围的局部变量.

有没有办法在Python中执行此操作?

Dav*_*ick 36

import sys    
sys._getframe(number)
Run Code Online (Sandbox Code Playgroud)

当前帧的数字为0,帧的数量为1,依此类推.

我在python中找到的帧的最佳介绍就在这里

但是,请查看检查模块,因为它会执行您想要对框架执行的最常见操作.


not*_*peg 27

最好的答案是使用检查模块; 不是私人职能sys.

import inspect

current_frame = inspect.currentframe()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.但有一点要注意,从这个链接:"CPython实现细节:这个函数依赖于解释器中的Python堆栈框架支持,不能保证在Python的所有实现中都存在.如果在没有Python堆栈框架支持的实现中运行这个函数返回None." (2认同)
  • `inspect.currentframe()` 实现实际上调用了“`sys` 中的私有方法”:`sys._getframe(1) if hasattr(sys, "_getframe") else None`。请参阅 cpython 代码库上的[第 1536 行](https://github.com/python/cpython/blob/master/Lib/inspect.py#L1536)。这也意味着即使调用“sys”也可能无法解决问题。 (2认同)

Kev*_*tle 23

我用这些小家伙进行调试和记录:

import sys

def LINE( back = 0 ):
    return sys._getframe( back + 1 ).f_lineno
def FILE( back = 0 ):
   return sys._getframe( back + 1 ).f_code.co_filename
def FUNC( back = 0):
    return sys._getframe( back + 1 ).f_code.co_name
def WHERE( back = 0 ):
   frame = sys._getframe( back + 1 )
   return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ), 
                           frame.f_lineno, frame.f_code.co_name )
Run Code Online (Sandbox Code Playgroud)