【问题标题】:Python Is it possible to recreate a whole call stack?Python 是否可以重新创建整个调用堆栈?
【发布时间】:2013-03-03 10:12:31
【问题描述】:

我有兴趣尝试使用 python。我知道我可以使用frame.f_localsframe.f_globals 检查并注入局部和全局变量到一个框架中,但我现在渴望创建一个完整的调用堆栈。

让我无法仅仅更改堆栈信息的原因是 python 不允许我更改它。

我实际上考虑过以编程方式转换我正在使用的 python 模块,以模拟缠绕堆栈。但我知道这是一个糟糕的解决方案,因为使用 ifwhilewithtry 的客户端代码很容易破坏我的代码。

我也研究过操纵frame.f_back,但无济于事。它是只读的。

>>> import sys
... 
... frm = sys._getframe()
... 
... frm.f_back = None
Traceback (most recent call last):
  File "<pyshell#4>", line 5, in <module>
    frm.f_back = None
TypeError: readonly attribute

我想要做什么

作为一项实验,我正在尝试通过网络实现fork()

我知道 stackless python 可能有我想要的,但仍然无法更改 frame.f_back 属性。

【问题讨论】:

  • python 解释器状态比您直接在堆栈跟踪中看到的要多。除非您设计的程序能够捕获它的状态,否则这对于 Python 的动态特性来说是一项不可能完成的任务。
  • 只有修改解释器本身才有可能。
  • 我想过写一个C扩展。
  • 但是修改解释器似乎是一件令人生畏的事情。

标签: python python-stackless


【解决方案1】:

看看 Online Python Tutor (http://www.pythontutor.com/)。它的作用是在执行期间捕获帧以创建 Python 代码的可视化。因此,您可以使用捕获的帧。

【讨论】:

  • 我假设它正在使用跟踪函数 ([sys.settrace](docs.python.org/library/sys.html#sys.settrace)) 捕获帧和执行的行。但话说回来,问题是关于从 python 更改/创建框架,而不仅仅是阅读。
【解决方案2】:
>>> type(sys._getframe())()

TypeError: cannot create 'frame' instances

对不起。

【讨论】:

    【解决方案3】:

    您应该查看AST modulesymtable module

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 2019-09-22
      • 2014-10-23
      • 2020-05-27
      • 2020-10-01
      • 2017-06-21
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多