[C++-sig] How to implement a cross-module C-API

Thomas Schipolowski schipo at dynamik.fb10.TU-Berlin.DE
Mon Sep 5 16:36:17 CEST 2005


Hello,

I have a working C++ extension module for python that has been exported 
with boost::python. Now I am trying to embed the python interpreter in a 
plain C program and make it execute a script which will import my C++ 
module and do some calculations with it. The results will end up in a 
C++ object created by the extension module. In the enveloping C program, 
I would be able to retrieve a PyObject* reference to the Python wrapper 
of this result object from the interpreter global namespace after the 
script finished. But is there a way to get fast C-level access to the 
underlying C++ object?

I read the extending/embedding part of the standard python docu and 
tried to think up a possible solution. As it seems to be a bit involved, 
can please somebody tell me if I am on the right way, or what I could do 
better?

 

My idea so far:

I would add some free functions to my C++ module that offer a minimal 
C-API for some of the classes defined there. These functions would 
accept a PyObject* reference as argument. Internally, they would 
construct a boost::python::object from the PyObject* and try to extract 
the expected C++ object type from it. Once I have the C++ object back, I 
could call its methods to perform the desired operations. All results 
would be returned as plain C structs or arrays.

In order to get access to the API functions in my C program, I would 
package them in a static table of function pointers, place a void* ptr 
to the table in a Python CObject, and make the CObject visible to my C 
program by exporting a function (to python) that delivers the CObject on 
request.

Can this work? The fact that there is a "extern C" declaration for using 
C functions in C++ makes me wonder if it is possible/safe to access a 
function compiled with C++ from a program compiled with a C compiler?

 

Thanks in advance,

Thomas.





More information about the Cplusplus-sig mailing list