C API: array of floats/ints from python to C and back

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sun Dec 28 02:15:55 EST 2008


En Sun, 28 Dec 2008 01:47:08 -0200, Daniel Fetchinson  
<fetchinson at googlemail.com> escribió:

>> As others already said, using a Numpy array or an array.array object  
>> would
>> be more efficient (and even easier - the C code gets a pointer to an  
>> array
>> of integers, as usual).
>
> I looked for this in the C API docs but couldn't find anything on how
> to make an array.array python object appear as a pointer to integers
> (or floats, etc) in C code. On
>
> http://docs.python.org/c-api/concrete.html#sequence-objects
>
> There is only list and tuple or maybe you mean byte array? That has
> only been introduced in python 2.6 and I'm working on 2.5.

array is a library module, and isn't really part of the API. You're  
looking for the buffer protocol:  
PyObject_AsReadBuffer/PyObject_AsWriteBuffer; see  
http://docs.python.org/c-api/objbuffer.html

Given an array.array('l') (containing C long integers):

int do_something(PyObject* obj)
{
     long *vec;
     Py_ssize_t nbytes, nitems, i;

     if (PyObject_AsReadBuffer(obj, (const void **)&vec, &nbytes) != 0)
         return NULL;
     nitems = nbytes/sizeof(long);
     for (i=0; i<nitems; i++) {
       /* do something with vec[i] */
     }
     return ret;
}

 From Python you can get "vec" and "nitems" using the buffer_info() method  
of array objects.

-- 
Gabriel Genellina




More information about the Python-list mailing list