Beginner Question PyObject* to int

Hi all,
I am just starting to use the C API for Python. What I want to do is to use an external funtion availabele in C and therfore I want to 'convert' a list of floats from Python to an array of floats in C which I can forward to the external function. So first step is tp parse a list to C and let the C code print the variables! The obviously too simplistic approach is below... When I call this function from python, e.g. cpp([1,2,3]) the output is: 25180552 25180540 25180528
Could you be so kind to help me here to get started with using C-functions from Python? Where is the error?
Thank you very much and kind regards,
Philipp
static PyObject * cpp_foo(PyObject *self, PyObject* args) {
PyObject* obj;
PyObject* seq;
int i, len;
if(!PyArg_ParseTuple(args, "O", &obj))
return NULL;
seq = PySequence_Fast(obj, "expected a sequence");
len = PySequence_Size(obj);
PyObject* item;
int a;
for (i=0; i<len; i++)
{
item=PySequence_Fast_GET_ITEM(seq, i);
a=item; // ?????????????????????????????????????????
printf("%i\n", a);
}
Py_DECREF(seq);
return None;
}

Philipp Heuser wrote:
I am just starting to use the C API for Python. What I want to do is to use an external funtion availabele in C and therfore I want to 'convert' a list of floats from Python to an array of floats in C
Since you're just starting, it's generally worth looking into Cython first, before investing time to learn the raw Python C-API.
Stefan

On 12/11/2008, at 1:55 AM, Philipp Heuser wrote:
Hi all,
I am just starting to use the C API for Python. What I want to do is
to use an external funtion availabele in C and therfore I want to
'convert' a list of floats from Python to an array of floats in C
which I can forward to the external function. So first step is tp
parse a list to C and let the C code print the variables! The
obviously too simplistic approach is below... When I call this
function from python, e.g. cpp([1,2,3]) the output is: 25180552 25180540 25180528Could you be so kind to help me here to get started with using C- functions from Python? Where is the error?
Thank you very much and kind regards,
Philipp
static PyObject * cpp_foo(PyObject *self, PyObject* args) { PyObject* obj; PyObject* seq; int i, len; if(!PyArg_ParseTuple(args, "O", &obj)) return NULL; seq = PySequence_Fast(obj, "expected a sequence"); len = PySequence_Size(obj); PyObject* item; int a;
for (i=0; i<len; i++) { item=PySequence_Fast_GET_ITEM(seq, i); a=item; // ?????????????????????????????????????????
Perhaps something like:
long a;
a = PyInt_AsLong(item);
if (a == -1 && PyErr_Occurred())
return NULL; /* error */
printf("%i\n", a);
Cheers, Chris Miles

On Tue, Nov 11, 2008 at 12:55 PM, Philipp Heuser <philipp@achtziger.de> wrote:
Hi all,
I am just starting to use the C API for Python. What I want to do is to use an external funtion availabele in C and therfore I want to 'convert' a list of floats from Python to an array of floats in C which I can forward to the external function. So first step is tp parse a list to C and let the C code print the variables! The obviously too simplistic approach is below... When I call this function from python, e.g. cpp([1,2,3]) the output is: 25180552 25180540 25180528
Could you be so kind to help me here to get started with using C-functions from Python? Where is the error?
Thank you very much and kind regards,
Philipp
static PyObject * cpp_foo(PyObject *self, PyObject* args) { PyObject* obj; PyObject* seq; int i, len; if(!PyArg_ParseTuple(args, "O", &obj)) return NULL; seq = PySequence_Fast(obj, "expected a sequence"); len = PySequence_Size(obj); PyObject* item; int a;
for (i=0; i<len; i++) { item=PySequence_Fast_GET_ITEM(seq, i); a=item; // ?????????????????????????????????????????
Add more '?'s here. PySequence_FAST_GET_ITEM returns a PyObject, you can't just go and give it to 'a' to turn it into an integer. Also, this variable 'i' better be of type Py_ssize_t instead of int.
So, to get your value as a long, first check item is indeed a long using PyLong_Check(item) and then convert it to a long with PyLong_AsLong(item):
printf("%i\n", a);
} Py_DECREF(seq); return None; }
capi-sig mailing list capi-sig@python.org http://mail.python.org/mailman/listinfo/capi-sig
-- -- Guilherme H. Polo Goncalves
participants (4)
-
Chris Miles
-
Guilherme Polo
-
Philipp Heuser
-
Stefan Behnel