How to transfer data structure or class from Python to C/C++?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Tue Oct 21 01:46:37 EDT 2008


En Fri, 17 Oct 2008 20:03:44 -0300, Aaron "Castironpi" Brady  
<castironpi at gmail.com> escribió:

> On Oct 16, 9:10 am, Hongtian <hongtian.i... at gmail.com> wrote:
>> Not exactly.
>>
>> In my C/C++ application, I have following function or flow:
>>
>> void func1(....)
>> {
>>     call PyFunc(struct Tdemo, struct &Tdemo1);
>>
>> }
>>
>> I mean I want to invoke Python function 'PyFunc' and transfer a data
>> structure 'Tdemo' to this function. After some process in Python, I
>> want it return 'Tdemo1' back to the C/C++ application.
>>
>> I research boost.python and think it is not a reasonable solution
>> because it make the C/C++ application too complex.
>>
>> Thanks.
> snip
>
> Solution produced here.  Includes dirty kludge, which will welcome
> correction.
>
> /C file:
>
> #include <Python.h>
>
> typedef struct {
>     int a;
>     float b;
> } TypeA;
>
> static PyObject *
> methA(PyObject *self, PyObject *args) {
>     TypeA a;
>     TypeA b;
>     PyObject* fun;
>     PyObject* res;
>
>     PyArg_ParseTuple( args, "O", &fun );
>     a.a= 10;
>     a.b= 20.5;
>
>     res= PyObject_CallFunction( fun, "II", &a, &b );
>
>     printf( "%i %f\n", b.a, b.b );
>     Py_DECREF( res );
>
>     return PyInt_FromLong( 0 );
> }
>
> static PyMethodDef module_methods[] = {
>     {"methA", methA, METH_VARARGS, "No doc"},
>     {NULL, NULL, 0, NULL}  /* Sentinel */
> };
>
>
> #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
> #define PyMODINIT_FUNC void
> #endif
> PyMODINIT_FUNC
> initng27ext(void)
> {
>     PyObject* m;
>     m = Py_InitModule3("ng27ext", module_methods,
>                        "Custom.");
>     if (m == NULL)
>       return;
> }
>
> /Py file:
>
> import ng27ext
>
> import ctypes as c
> class TypeA( c.Structure ):
>     _fields_= [
>         ( 'a', c.c_int ),
>         ( 'b', c.c_float )
>         ]
>
> from _ctypes import _cast_addr
> _data_cast= c.PYFUNCTYPE( c.py_object, c.c_void_p, c.py_object,
> c.py_object)( _cast_addr ) #dirty kludge
>
> def exposed( obj1, obj2 ):
>     cob1= _data_cast( obj1, None, c.POINTER( TypeA ) )
>     cob2= _data_cast( obj2, None, c.POINTER( TypeA ) )
>     print cob1.contents.a, cob1.contents.b
>     cob2.contents.a= c.c_int( 60 )
>     cob2.contents.b= c.c_float( 70.5 )
>     print cob2.contents.a, cob2.contents.b
>
> print ng27ext.methA( exposed )
>
> /Compile & link:
>
> c:/programs/mingw/bin/gcc ng27ext.c -c -Ic:/programs/python25/include
> c:/programs/mingw/bin/gcc -shared ng27ext.o -o ng27ext.pyd -Lc:/
> programs/python25/libs -lpython25
>
> /Output:
>
> 10 20.5
> 60 70.5
> 60 70.500000
> 0
> Press any key to continue . . .
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
Gabriel Genellina




More information about the Python-list mailing list