2010-06-30 10 views
0

J'essaie d'appeler une fonction c à partir de mon extension et j'ai réduit le problème à ce cas de test.PyArg_ParseTuple provoquant une erreur de segmentation

#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} 
}; 

Aucune idée de ce que je pourrais faire de mal. (Python version 2.6.4).

Répondre

1

Hmmm. Je pense que la signature de la méthode doit être le suivant:

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

Si vous invoquez votre test_method comme une méthode liée (à savoir une méthode de quelque instance d'objet), self sera l'objet lui-même. Si test_method est une fonction de module, self est le pointeur passé à Py_InitModule4() lorsque vous avez initialisé le module (ou NULL si vous avez utilisé Py_InitModule()). Le fait est que Python ne fait aucune distinction entre les méthodes d'instance liées et les fonctions ordinaires au niveau du code, c'est pourquoi vous devez passer self même si vous implémentez une fonction simple.

Voir this page pour plus de détails.

+0

C'était par curiosité, à quoi se référait-elle? Le module? – jtm

+0

J'ai prolongé ma réponse pour répondre à cela. –

Questions connexes