使用Python C-API 得到当前值栈的大小
Use Python C-API to get the current size of value stack
我在玩Python的C-API。具体来说,我想看看我是否可以检查值堆栈当前有多少个元素。这是我的代码:
#include <Python.h>
#include <frameobject.h>
int test() {
PyFrameObject* f = PyEval_GetFrame();
return (int)(f->f_stacktop - f->f_valuestack);
}
我不确定这是否可行,但是 Python's source code 中存在这一行,所以我试了一下。
这通常会产生负数,例如 -547715639
。
很明显我做错了,可能是因为文档中描述的内容:"Frame evaluation usually NULLs it (f_stacktop)"。什么是正确的方法,或者甚至可能?
这是不可能的。参见 。
总之,我应该用
(int)(stack_pointer - f->f_valuestack);
然而,stack_pointer
是 _PyEval_EvalFrameDefault 函数内部的局部变量,因此无法从外部访问。
没有什么是不可能的♀️
以下是我如何从已编译的扩展模块中的值堆栈中获取内容:
PyObject **stack_pointer = frame->f_stacktop;
if (frame->f_stacktop == frame->f_valuestack) {
PyErr_SetString(PyExc_ValueError, "stack is empty");
return NULL;
}
if (!stack_pointer) {
PyErr_SetString(PyExc_ValueError, "stack pointer is null?");
return NULL;
}
// Top-most on the value stack ought to be the "receiver".
PyObject *next = stack_pointer[-1];
下面是如何使用 ctypes
在 Python 中获取它:
我在玩Python的C-API。具体来说,我想看看我是否可以检查值堆栈当前有多少个元素。这是我的代码:
#include <Python.h>
#include <frameobject.h>
int test() {
PyFrameObject* f = PyEval_GetFrame();
return (int)(f->f_stacktop - f->f_valuestack);
}
我不确定这是否可行,但是 Python's source code 中存在这一行,所以我试了一下。
这通常会产生负数,例如 -547715639
。
很明显我做错了,可能是因为文档中描述的内容:"Frame evaluation usually NULLs it (f_stacktop)"。什么是正确的方法,或者甚至可能?
这是不可能的。参见
总之,我应该用
(int)(stack_pointer - f->f_valuestack);
然而,stack_pointer
是 _PyEval_EvalFrameDefault 函数内部的局部变量,因此无法从外部访问。
没有什么是不可能的♀️
以下是我如何从已编译的扩展模块中的值堆栈中获取内容:
PyObject **stack_pointer = frame->f_stacktop;
if (frame->f_stacktop == frame->f_valuestack) {
PyErr_SetString(PyExc_ValueError, "stack is empty");
return NULL;
}
if (!stack_pointer) {
PyErr_SetString(PyExc_ValueError, "stack pointer is null?");
return NULL;
}
// Top-most on the value stack ought to be the "receiver".
PyObject *next = stack_pointer[-1];
下面是如何使用 ctypes
在 Python 中获取它: