On 3/06/2006 9:51 AM, Luke Miller wrote: > Hello, > > I am working on my first python module based on a c program. The > module builds and installs OK using dist-utils, and imports fine into > python. However, when I try and use the one wrapper > ("modgl.glVertex4f(1, 2, 3, 1)") in the module, it seg faults. > > Can anyone spot why this isn't working, or recommend a way to debug > these things. >
> Thanks, > Luke > > #include <Python.h> > > static PyObject *_wrap_glVertex4f(PyObject *self, PyObject *args) { > PyObject *resultobj = NULL; > float arg1 ; > float arg2 ; > float arg3 ; > float arg4 ; > PyObject * obj0 = 0 ; > PyObject * obj1 = 0 ; > PyObject * obj2 = 0 ; > PyObject * obj3 = 0 ; > > if(!PyArg_ParseTuple(args,(char > *)"OOOO:glVertex4f",&obj0,&obj1,&obj2,&obj3)) goto fail; > { > arg1 = (float)(PyFloat_AsDouble(obj0)); Not testing for an error after an API call is just asking for trouble. > } > { > arg2 = (float)(PyFloat_AsDouble(obj1)); > } > { > arg3 = (float)(PyFloat_AsDouble(obj2)); > } > { > arg4 = (float)(PyFloat_AsDouble(obj3)); > } You are making it really hard for yourself. Try this: if(!PyArg_ParseTuple(args,"ffff:glVertex4f",&arg1,&arg2 etc etc The batteries are already included. Using the code for the precise type that you want gives you checking for type mismatches, a with sensible error message. > glVertex4f(arg1,arg2,arg3,arg4); You don't declare this function before calling it. That's dangerous. > > Py_INCREF(Py_None); resultobj = Py_None; > return resultobj; > fail: > return NULL; > }; > > > static PyMethodDef modglMethods[] = { > { (char *)"glVertex4f", _wrap_glVertex4f, METH_VARARGS, NULL}, > { NULL, NULL, 0, NULL } > }; > > > PyMODINIT_FUNC modgl(void) I can't see how you were able to import the module. For "import modgl" to work, your initialisation function should be called "initmodgl". > { > (void) Py_InitModule("modgl", modglMethods); > }; > > You are writing an extension, not embedding Python. You don't need a main(). Lose it. > int > main(int argc, char *argv[]) > { > /* Pass argv[0] to the Python interpreter */ > Py_SetProgramName(argv[0]); > > /* Initialize the Python interpreter. Required. */ > Py_Initialize(); > > /* Add a static module */ > initmodgl(); > return 0; > }; Below is a cutdown version of your module, that returns a value so that you can see that it is working. You might like to use that as a base. Here it is working: |>>> import modgl |>>> modgl.glVertex4f(1, 2, 3, 4) 10.0 |>>> modgl.glVertex4f(1, 2, "three", 4) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: a float is required |>>> HTH, John 8<--- #include <Python.h> static PyObject * _wrap_glVertex4f(PyObject *self, PyObject *args) { PyObject *resultobj = NULL; float arg1, arg2, arg3, arg4; if(!PyArg_ParseTuple(args,"ffff:glVertex4f",&arg1,&arg2,&arg3,&arg4)) goto fail; /* glVertex4f(arg1,arg2,arg3,arg4); */ /* Py_INCREF(Py_None); resultobj = Py_None; */ resultobj = Py_BuildValue("d", (double)(arg1 + arg2 + arg3 + arg4)); return resultobj; fail: return NULL; }; static PyMethodDef modglMethods[] = { { (char *)"glVertex4f", _wrap_glVertex4f, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initmodgl(void) { (void) Py_InitModule("modgl", modglMethods); }; 8<--- -- http://mail.python.org/mailman/listinfo/python-list