首页 > 解决方案 > Python C API:如何在不知道其类型的情况下将任何 Python 对象存储为 void*?

问题描述

我想知道是否可以将任何 Python 对象作为 void* 存储在 Python C API 中,稍后将按原样返回给 python。

我试图做这样的事情:

store_python_object(PyObject *self, PyObject *args)
{
    int retval;
    PyObject *self_capsule;
    void *stored_object;
    /* Parse input arguments */
    retval = PyArg_ParseTuple(args,
                              "OO:store_python_object",
                              &self_capsule,
                              &stored_object);
    if (!retval) {
        return NULL;
    }
    // More code here...
    // Return stored_object to python as-is
}

但是,例如,在存储 int 时,这似乎有一个奇怪的行为(同样,我想存储任何 Python 对象,而不仅仅是 int)。

标签: pythoncpython-c-api

解决方案


发现了我的问题:
我在 C 中存储了一个 python 对象,但没有增加它的引用计数器(使用Py_INCREF(PyObject *o))。显然,python 释放了导致奇怪行为的 python 对象。

谢谢大家。


推荐阅读