Creating a PyObject* from a C double*
Alex Martelli
aleax at aleax.it
Sun Apr 13 05:03:52 EDT 2003
Joze wrote:
> Hi,
>
> As part of a Python extension, i have an array of doubles created in a
> C function, which should return a corresponding PyObject* to Python.
> The array is meant to be used by Numeric/numarray, but apparently, the
> C function cannot directly return a PyArrayObject*.
It can _after casting the pointer_ -- is that what's blocking you?
> I have tried PyArray_FromDims(), PyArray_FromDimsAndData() but i can't
Those should only be used for static arrays -- ones that never will
be deallocated; it's unlikely that's what you want.
> seem to get it right. Can anyone tell me how this works? I'd be most
> grateful.
Here's a tiny working example just hacked together:
#include <Python.h>
#include <Numeric/arrayobject.h>
static PyObject*
tiny(PyObject* self, PyObject* args)
{
PyArrayObject* parr;
int dims[1];
int i;
double xx[] = {1.0, 2.3, 4.5, 6.7, 8.9};
double *data;
dims[0] = 5;
parr = (PyArrayObject*) PyArray_FromDims(1, dims, 'd');
if(!parr) return 0;
data = (double*) parr->data;
for(i=0; i<5; ++i)
data[i] = xx[i];
return PyArray_Return(parr);
}
static PyMethodDef tinyMethods[] = {
{"tiny", tiny, METH_VARARGS, "example"},
{0}
};
void
inittiny(void)
{
Py_InitModule("tiny", tinyMethods);
import_array();
}
anf after a python setup.py install with the obvious setup.py,
[alex at lancelot pronu]$ python2.2 -c 'import tiny; print tiny.tiny()'
array([1.0, 2.2999999999999998, 4.5, 6.7000000000000002,
8.9000000000000004], 'd')
[alex at lancelot pronu]$
Alex
More information about the Python-list
mailing list