2013-03-03 50 views
2

我很想尝试python。我知道我可以检查并使用frame.f_localsframe.f_globals将局部和全局变量注入到框架中,但我现在很想创建一个完整的调用堆栈。Python是否可以重新创建整个调用堆栈?

什么阻止我改变堆栈信息是因为python不允许我改变它。

我实际上已经考虑通过编程来转换我正在使用的python模块,以便模拟堆栈。但我知道这是一个可怕的解决方案,因为if,while,withtry的客户端代码使用情况很容易破坏我的代码。

我也看着操纵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属性。

+2

还有更多的比你的堆栈跟踪直接看到Python解释器的状态。除非你设计一个程序来捕捉它的状态,否则这是Python不可或缺的任务,具有python的动态特性。 – 2013-03-03 10:15:15

+0

这可能只有在您修改解释器本身时才有可能。 – 2013-03-03 10:24:14

+0

我想写一个C扩展。 – 2013-03-03 10:24:31

回答

0
>>> type(sys._getframe())() 

TypeError: cannot create 'frame' instances 

对不起。

1

看看在线Python导师(http://www.pythontutor.com/)。它的作用是在执行过程中捕获帧以创建python代码的可视化。所以,你可以使用捕获的帧。

+0

我假设它使用跟踪函数(['sys.settrace'](docs.python.org/library/sys.html#sys.settrace))捕获帧和执行行。但是接下来的问题是关于从python改变/创建框架,而不仅仅是阅读。 – 2013-03-03 12:33:49

相关问题