使用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];

来源:https://github.com/dimaqq/awaitwhat/blob/e242ea7502cd13ebf7aca16700240aa592467f3a/awaitwhat/what.c#L24-L37

下面是如何使用 ctypes 在 Python 中获取它: