如何在堆栈帧之间上下移动?

时间:2015-06-12 04:10:22

标签: python cpython stackframe

假设我使用sys._getframe(1)获得了一个堆栈帧,这显然不是当前帧。

现在我想以某种方式移动到外部堆栈框架并执行一个语句,如x=10,以便在该框架中创建一个变量。

我理解以这种方式设置变量不是一个好习惯,但它可能只是其他一些声明。因此,重要的部分是如何移动到该框架。 with(frame)似乎不起作用。

我认为应该可以,否则为什么在getinnerframes模块中会有两个名为getouterframesinspect的函数?除非你可以移动到外框,为什么你甚至会有内框?

修改:在pdb模块中,他们有两个命令上下都有docs

  

d(自己)将当前帧在堆栈跟踪中向下移动一级(到a   较新的框架)。

     

u(p)将当前帧向上移动一层   跟踪(到较旧的框架)。

这会对我的情况有所帮助吗?如果是,如何使用它?

1 个答案:

答案 0 :(得分:2)

这通常不可行。如果框架对应于模块级代码,则可以执行

exec 'x=10' in frame.f_globals, frame.f_locals

在Python 2中,或

exec('x=10', frame.f_globals, frame.f_locals)
Python中的

3.然而,如果框架对应于函数调用或类体,那么这将执行x=10,就好像它嵌入嵌套在框架内的类语句中一样范围:

  

If two separate objects are given as globals and locals, the code will be executed as if it were embedded in a class definition.

函数文本之外的任何代码都不能创建该函数的局部变量。