PyArg_ParseTuple, вызывающий ошибку сегментации - PullRequest
0 голосов
/ 30 июня 2010

Я пытаюсь вызвать функцию ac из моего внутреннего номера и сузила проблему до этого контрольного примера.

#import "Python.h"

...

// Called from python with test_method(0, 0, 'TEST')
static PyObject*
test_method(PyObject *args)
{
    int ok, x, y, size;
    const char *s;

    // this causes Segmentation fault
    //ok = PyArg_ParseTuple(args, "iis#", &x, &y, &s, &size); 

    // also segfaults
    //if(ok) PyErr_SetString(PyExc_SystemError, 'Exception');

    // this does not cause segfault but fills the variables with garbage   
    ok = PyArg_ParseTuple(&args, "iis#", &x, &y, &s, &size);

    // Example: >test_method 0, 37567920, (garbage)
    printf(">test_method %d, %d, %s\n", x, y, s);

    /* Success */
    Py_RETURN_NONE;
}

static PyMethodDef testMethods[] =
{
     {"test_method", test_method, METH_VARARGS,
             "test_method"},
     ...

     {NULL, NULL, 0, NULL}
};

Есть идеи, что я могу делать неправильно.(Python версия 2.6.4).

1 Ответ

1 голос
/ 30 июня 2010

Хммм.Я думаю, что подпись вашего метода должна быть такой:

static PyObject* test_method(PyObject* self, PyObject* args)

Если вы вызываете ваш test_method как связанный метод (то есть метод некоторого экземпляра объекта), self будет сам объект,Если test_method является функцией модуля, self - указатель, переданный в Py_InitModule4() при инициализации модуля (или NULL, если вы использовали Py_InitModule()).Дело в том, что Python не делает различий между связанными методами экземпляра и обычными функциями на уровне кода, поэтому вам нужно передать self, даже если вы реализуете простую функцию.

См. на этой странице для более подробной информации.

...