PyArg_ParseTuple SegFaults в CApi - PullRequest
       19

PyArg_ParseTuple SegFaults в CApi

2 голосов
/ 14 октября 2011

Я пишу код, пытаюсь привыкнуть к C API массивов NumPy.

#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 и вернуть его обратно. К сожалению, это также дает SegFault.

Linux, 64-bit, Python 2.7.1

1 Ответ

1 голос
/ 14 октября 2011

С документы :

O (объект) [PyObject *]
Сохраните объект Python (без преобразования) в указателе объекта C. Таким образом, C-программа получает фактический переданный объект. Количество ссылок объекта не увеличивается. Сохраненный указатель не равен NULL .

O! (объект) [ тип объекта , PyObject *]
Сохраните объект Python в указателе объекта C. Это похоже на O, но ...

Вы возвращаете украденную ссылку. Сначала увеличьте его.

...