2010-06-30 153 views
0

我想從我的擴展調用一個c函數,並將問題縮小到這個測試用例。PyArg_ParseTuple導致分段錯誤

#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

嗯。我覺得你的方法的簽名應該是這樣的:

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

如果要調用你的test_method作爲一個綁定方法(即某些對象實例的方法),self將對象本身。如果test_method是模塊函數,則self是在初始化模塊時傳遞給Py_InitModule4()的指針(如果使用的是Py_InitModule(),則爲NULL)。問題在於,Python在代碼級別上對綁定實例方法和普通函數沒有區別,這就是爲什麼即使您正在實現普通函數,也必須通過self

查看this page瞭解更多詳情。

+0

就是這樣,出於好奇,自我指的是什麼?該模塊? – jtm 2010-06-30 09:36:57

+0

我已經擴展了我的回答來回答這個問題。 – 2010-06-30 10:45:14