PyArg_ParseTuple 在 CApi 中发生段错误

2 投票
1 回答
1462 浏览
提问于 2025-04-17 04:16

我正在写一段代码,想熟悉一下NumPy数组的C接口。

#include <Python.h>
#include "numpy/arrayobject.h"
#include <stdio.h>
#include <stdbool.h>


static char doc[] =
"Document";

static PyArrayObject *
    trace(PyObject *self, PyObject *args){

    PyArrayObject *matin;

    if (!PyArg_ParseTuple(args, "O!",&PyArray_Type, &matin))
         return NULL;

    printf("a");
    return matin;
}

static PyMethodDef TraceMethods[] = {
    {"trace", trace, METH_VARARGS, doc},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
inittrace(void)
{
    (void) Py_InitModule("trace", TraceMethods);
    import_array();
}

这是一个简化版。我只是想获取一个类型为 PyArrayObject 的对象并把它返回。不幸的是,这样做也会导致程序崩溃。

操作系统是Linux,64位,使用的是Python 2.7.1。

1 个回答

1

来自文档

O(对象)[PyObject *]
这个选项可以把一个Python对象直接存储在C语言的对象指针里,也就是说C程序可以直接拿到传入的那个对象。注意,这个对象的引用计数不会增加。存储的指针不会是NULL

O!(对象)[类型对象, PyObject *]
这个选项也可以把一个Python对象存储在C语言的对象指针里。它和O很相似,但是……

你返回的是一个被“偷走”的引用。记得先增加它的引用计数。

撰写回答