PyArg_ParseTuple 在 CApi 中发生段错误
我正在写一段代码,想熟悉一下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
很相似,但是……
你返回的是一个被“偷走”的引用。记得先增加它的引用计数。