Passing an object from script to C code
Hi,
As a beginner, I have a question about passing a class instance from Python script to my C code. What I am doing is basically creating a class in the script:
class dbvalue: def __init__(self, index, type): self.id = index # unsigned integer self.type = type # string
last_roi = dbvalue(id, type); bmdl_batch.set_input_from_db(1, last_roi); <--------
I would like to call my C function with last_roi and able to recover id and type in the code. The C part is follows:
PyObject *set_input_from_db(PyObject* self, PyObject *args) { unsigned input; PyObject *obj;
if (!PyArg_ParseArg(args, "iO:set_input_from_db", &input, &obj)) return NULL;
.... }
I am not sure if PyArg_ParseArg() is the right method to get the object. I used "O:.." to get it but after that, how do I acces index and type fields of the object. Do I create an equivalent class/struct in C code to? Again, all I want is pass the 2 values together in an object and able to recover then in C code.
Thanks,
Gamze
Hi,
--- On Mon, 1/26/09, Gamze Tunali <gdtunali@yahoo.com> wrote:
From: Gamze Tunali <gdtunali@yahoo.com> Subject: [capi-sig] Passing an object from script to C code To: capi-sig@python.org Date: Monday, January 26, 2009, 9:56 PM
As a beginner, I have a question about passing a class instance from Python script to my C code. What I am doing is basically creating a class in the script:
class dbvalue: def __init__(self, index, type): self.id = index # unsigned integer self.type = type # string
last_roi = dbvalue(id, type); bmdl_batch.set_input_from_db(1, last_roi); <--------
I would like to call my C function with last_roi and able to recover id and type in the code. The C part is follows:
PyObject *set_input_from_db(PyObject* self, PyObject *args) { unsigned input; PyObject *obj;
if (!PyArg_ParseArg(args, "iO:set_input_from_db", &input, &obj)) return NULL;
.... }
I am not sure if PyArg_ParseArg() is the right method to get the object.
It will work, but you should use PyArg_ParseTuple[1] instead, for the reasons explained in the api reference[2].
[1] http://docs.python.org/c-api/arg.html#PyArg_ParseTuple [2] http://docs.python.org/c-api/arg.html#PyArg_Parse
I used "O:.." to get it but after that, how do I acces index and type fields of the object. Do I create an equivalent class/struct in C code to? Again, all I want is pass the 2 values together in an object and able to recover then in C code.
You can use PyObject_GetAttr (or PyObject_GetAttrString) from the Object protocol [3] to access attributes of an object.
Once you got your attribute, lets say your id field is a Python Integer which you want to convert to a C int, you can use the Integer object layer for that [4].
[3] http://docs.python.org/c-api/object.html [4] http://docs.python.org/c-api/int.html
Hopefully, that pointed you in the right direction.
Martin
Gamze Tunali wrote:
As a beginner, I have a question about passing a class instance from Python script to my C code. What I am doing is basically creating a class in the script:
class dbvalue: def __init__(self, index, type): self.id = index # unsigned integer self.type = type # string
last_roi = dbvalue(id, type); bmdl_batch.set_input_from_db(1, last_roi); <--------
I would like to call my C function with last_roi and able to recover id and type in the code. The C part is follows:
You might want to leave these things to Cython:
cdef class dbvalue:
def __init__(self, index, type):
self.id = index # unsigned integer self.type = type # string
PyObject *set_input_from_db(PyObject* self, PyObject *args) { unsigned input; PyObject *obj;
if (!PyArg_ParseArg(args, "iO:set_input_from_db", &input, &obj)) return NULL;
.... }
I am not sure if PyArg_ParseArg() is the right method to get the object. I used "O:.." to get it but after that, how do I acces index and type fields of the object. Do I create an equivalent class/struct in C code to? Again, all I want is pass the 2 values together in an object and able to recover then in C code.
Thanks,
Gamze
capi-sig mailing list capi-sig@python.org http://mail.python.org/mailman/listinfo/capi-sig
(sorry, accidentally hit 'send')
Gamze Tunali wrote:
As a beginner, I have a question about passing a class instance from Python script to my C code. What I am doing is basically creating a class in the script:
class dbvalue: def __init__(self, index, type): self.id = index # unsigned integer self.type = type # string
last_roi = dbvalue(id, type); bmdl_batch.set_input_from_db(1, last_roi); <--------
I would like to call my C function with last_roi and able to recover id and type in the code.
You may want to leave these things to Cython:
cdef class dbvalue:
cdef unsigned int id
cdef str type
def __init__(self, index, type):
self.id = index # will raise an exception if not uint
self.type = type.encode('ASCII')
...
class ...:
def set_input_from_db(self, someval, dbvalue value):
print someval, value.id, value.type
Cython will translate this to efficient C code for you.
Stefan
participants (3)
-
Gamze Tunali
-
Martin Poirier
-
Stefan Behnel