我正在解析一些Python字节码,以获取表达式所赋予的变量的名称。我认为如果我能读取Python框架的堆栈内容,这会更容易。
我已尝试使用此C扩展程序,但我始终得到ValueError: no value stack
,因此PyFrameObject::f_stackop
始终为NULL
。
static PyObject*
_get_frame_valuestack(PyObject* self, PyObject* args)
{
PyFrameObject* frame;
if (!PyArg_ParseTuple(args, "O", &frame)) {
return NULL;
}
if (((PyObject*) frame)->ob_type != &PyFrame_Type) {
PyErr_SetString(PyExc_TypeError, "expected frame object");
return NULL;
}
if (frame->f_valuestack == NULL || frame->f_stacktop == NULL) {
PyErr_SetString(PyExc_ValueError, "no value stack");
return NULL;
}
PyObject* list = PyList_New(0);
PyObject** p;
for (p = frame->f_valuestack; p < frame->f_stacktop; ++p) {
PyList_Append(list, *p);
}
return list;
}
这是一个测试片段。
def foo():
print(_utils.get_frame_valuestack(sys._getframe(1)))
return 40
var = 2 + foo()
我希望在[2]
中打印foo()
之类的内容。实际结果可能会有所不同,具体取决于其实际执行情况。
显然f_valuestack
不是我真正想要的。有没有办法可以检索框架堆栈的内容?