Py_BuildValue or PyList_SetItem()

Sheldon shejo284 at gmail.com
Wed Jan 3 17:15:58 EST 2007


Jack Diederich skrev:

> On Wed, Jan 03, 2007 at 01:16:38PM -0800, Sheldon wrote:
> > I have a function that creates python objects out of C arrays and
> > returns them to Python. Below is a working example that I later want to
> > expand to return 12 arrays back to Python. The problem is that when I
> > print out the values in Python I get undesired reults. See below. Does
> > anyone know what is going on here?
> > The array values are good before the conversion.
> >
> > **************************************
> > int createPythonObject(void) {
> >   int i,j,k;
> >   PyObject *Rva=PyList_New(12);
> >
> >   for (i = 0; i < 12; i++) {
> >     PyObject *op = PyFloat_FromDouble((double)va[i]);
> >     if (PyList_SetItem(Rva,i,op) !=0) {
> >       fprintf(stderr,"Error in creating python va object\n");
> >       exit(EXIT_FAILURE);
> >     }
> >     Py_DECREF(op);
> >     op = 0;
> >   return Py_BuildValue("N",Rva);
> >  }
> >
> > Results in Python:
> >
> > <refcnt 0 at 0x80d885c>, <refcnt 0 at 0x80d885c>, <refcnt 0 at
> > 0x80d885c>, <refcnt 0 at 0x80d885c>, <refcnt 0 at 0x80d885c>, <refcnt 0
> > at 0x80d885c>, <refcnt 0 at 0x80d885c>, <refcnt 0 at 0x80d885c>,
> > <refcnt 0 at 0x80d885c>, <refcnt 0 at 0x80d885c>, <refcnt 0 at
> > 0x80d885c>, <refcnt 0 at 0x80d885c>
> >
>
> PyList_SetItem steals a reference to "op" so DECREF'ing it reduces
> the refcount to zero.
>
> http://docs.python.org/api/listObjects.html
> 
> -Jack

Thanks Jack,

It works now!

/Sheldon




More information about the Python-list mailing list