【发布时间】:2013-03-03 10:12:31
【问题描述】:
我有兴趣尝试使用 python。我知道我可以使用frame.f_locals 和frame.f_globals 检查并注入局部和全局变量到一个框架中,但我现在渴望创建一个完整的调用堆栈。
让我无法仅仅更改堆栈信息的原因是 python 不允许我更改它。
我实际上考虑过以编程方式转换我正在使用的 python 模块,以模拟缠绕堆栈。但我知道这是一个糟糕的解决方案,因为使用 if、while、with 和 try 的客户端代码很容易破坏我的代码。
我也研究过操纵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扩展。
-
但是修改解释器似乎是一件令人生畏的事情。