chris wrote: > This is my first attempt at undertaking a C extension module. I want > to wrap an existing C library so I can call the functions from Python. > There are only two functions I'm interested in calling. I did mess > with Pyrex a bit and Swig, to no avail, so I turned to doing it by > hand. Using the example in Programming Python, I did get the easier of > the two functions working--only takes a string parameter. I'm stuck > now on the other function and not sure how to wrap it, because it > involves some structs. Here's a simplified version of the C: > > struct In > { > int x; > char* s; > ... (only primitive data types) > }; > > struct Out > { > int y; > char* s; > ... (only primitive data types) > }; > > Out* func(In* x, Out* y); > > So the function takes pointers to the two structs, and fills out the > output struct and also returns the pointer to it. I would envision the > Python looking like > > in = In() > in.y = 1 > in.s = "abc" > ... > > out = func(in) > > maybe? Just no idea how to deal with the structs in the C extension > module code. > > Any tips appreciated. > > Thanks, > Chris >
Since others have responded about Pyrex, I'll just add my two cents, which may or not apply to you. The idea of filling in a struct, passing it to a function, then returning a struct, is a typical c-ism. If the only purpose of the structs is to pass data to the function and receive the result, read on. On the other hand, if the structures represent "things" in the object-oriented sense, just ignore what I am saying. I would wrap the function such that the python code simply takes a set of parameters and returns a tuple. This is much more pythonic, and much easier to code. y,s,... = func(x,s,...) My untested pseudocode would look something like this: static PyObject *map_sweep(map__object *self, PyObject *args) { In input; Out output; if (PyArg_ParseTuple(args, "is...", &(In.x), &(In.s), ...)) { return NULL; } func(&In, &Out); return Py_BuildValue("is...", Out.y, Out.s, ...); } -- http://mail.python.org/mailman/listinfo/python-list