Simple question: How to pass a C++ class reference to a callback?

Harri Pesonen fuerte at sci.fi
Tue Sep 2 13:22:23 EDT 2003


I read it twice, but I'm not sure that I got it.

You mean that I add something like:

static PyObject*
emb_Set(PyObject *self, PyObject *args) {
     char *key, *value;
     if(!PyArg_ParseTuple(args, "ss", &key, &value))
         return NULL;
     // how the get the class instance pointer:
     PyObject *c_api_object = PyObject_GetAttrString(self, "_C_API");
     if (c_api_object) {
         if (PyCObject_Check(c_api_object)) {
             myClass *p = (myClass *)PyCObject_AsVoidPtr(c_api_object); 

             // do something with the C++ class here
         }
         Py_DECREF(c_api_object);
     }
     Py_INCREF(Py_None);
     return Py_None;
}

And in C++ class:

     Py_Initialize();
     PyObject *m = Py_InitModule("test", EmbMethods);
     // ??
     PyObject *c_api_object = PyCObject_FromVoidPtr((void *)this, NULL);
     if (c_api_object) {
         PyModule_AddObject(m, "_C_API", c_api_object);
         PyRun_SimpleString(script);
     }
     Py_Finalize();



T. Panbru wrote:

> Try encapsulating your C++ class reference in a CObject, using:
> 
>     PyObject* PyCObject_FromVoidPtr( void* cobj, void (*destr)(void *))
>     void* PyCObject_AsVoidPtr( PyObject* self)
> 
> and so forth, to go back and forth between the C++ and Python realms.
> 
> Check out the Python docs at:
> 
>     http://www.python.org/doc/2.3/api/cObjects.html
> 
> Tim
> 
>  > Harri Pesonen wrote:
> 
>> How do I pass the calling C++ class reference (or anything) to a 
>> callback?
>> My code is:
>>
>> static PyObject*
>> emb_Set(PyObject *self, PyObject *args)
>> {
>>     char *key, *value;
>>     if(!PyArg_ParseTuple(args, "ss", &key, &value))
>>         return NULL;
>>     // do something with the C++ class here
>>     // how the get the class instance pointer?
>>     Py_INCREF(Py_None);
>>     return Py_None;
>> }
>>
>> static PyMethodDef EmbMethods[] = {
>>     {"Set", emb_Set, METH_VARARGS, "Sets the given variable."},
>>     {NULL, NULL, 0, NULL}
>> };
>>
>> in C++ class:
>>
>>     Py_Initialize();
>>     Py_InitModule("test", EmbMethods);
>>     PyRun_SimpleString(script);
>>     Py_Finalize();
>>
>> Harri
> 
> 





More information about the Python-list mailing list