2010-06-30 5 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

+0

답변에 대한 답변을 연장했습니다. –

관련 문제