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

Python 如何在堆栈帧之间上下移动?,python,cpython,stack-frame,Python,Cpython,Stack Frame,比方说,我使用sys.\u getframe(1)获得一个堆栈帧,它显然不是当前帧 现在,我想,以某种方式,移动到外部堆栈帧并执行一条语句,比如说,x=10,以便在该帧中创建一个变量 我理解这样设置变量不是一个好的做法,但它可能是其他语句。因此,重要的部分是如何移动到该帧与(帧)似乎不起作用 我认为这应该是可能的,否则为什么在inspect模块中会有两个名为getinnerframes和getouterframes的函数?除非你可以移动到外部框架,为什么你甚至会有内部框架 编辑:在pdb模块中,

比方说,我使用
sys.\u getframe(1)
获得一个堆栈帧,它显然不是当前帧

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

我理解这样设置变量不是一个好的做法,但它可能是其他语句。因此,重要的部分是如何移动到该帧<代码>与(帧)似乎不起作用

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

编辑:在
pdb
模块中,他们有两个上下命令

d(自身)将当前帧在堆栈跟踪中向下移动一级(到 更新的帧)

u(p)将当前帧在堆栈中向上移动一级 跟踪(到较旧的帧)


这对我的案子有帮助吗?如果是,如何使用它?

这通常是不可能的。如果框架对应于模块级代码,则可以执行以下操作:

exec 'x=10' in frame.f_globals, frame.f_locals
在Python 2中,或

exec('x=10', frame.f_globals, frame.f_locals)
在Python3中。但是,如果框架对应于函数调用或类主体,那么这将执行
x=10
,就像它嵌入到嵌套在框架范围内的class语句中一样:


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

好的,如果这是真的,那么在
inspect
中使用
getinnerframes
函数的背后可能有什么解释?它实际上应该返回什么?@bendtherules:所有返回或访问帧的东西主要是检查它们的数据,而不是修改它。是的,但是,该函数甚至返回什么?@bendtherules:它返回它所返回的内容—一个回溯帧的帧记录列表,以及引发异常的所有内部帧。回溯的框架似乎就是捕获异常的框架。“帧记录”在前面有定义。如果你有更多的问题,你应该点击提问按钮,而不是把它们放在不同问题的评论中。我真的不明白你为什么认为这个问题是相关的;这不像
getinnerframes
的有用性取决于能够以某种方式在返回的帧中执行语句