[C++-sig] Boost python simple interfacing

Giuseppe Corbelli giuseppe.corbelli at copanitalia.com
Tue Sep 24 09:33:17 CEST 2013


On 21/09/2013 16:52, Kassiopi Kassiopi2 wrote:
> Hi,
>
> I want to call a c++ function from an embedded python shell, using boost
> python. All the examples I've seen online describe how to expose a whole class
> or some functions, but all cases refer to *standalone* parts of code.
> My case is different though. The function I want to expose is not standalone,
> and has a dependency:
>
> ------- start of documentModule.cpp --------
> #include <commandManager.hpp>
> #include <boost/python.hpp>
>
> void newDocument( bool makeActive ) {
>       // depends on commandManager here
>      GetCommandMananager()->submitCommand( new newDocumentCmd( makeActive ) );
> }
>
> BOOST_PYTHON(documentModule) {
>      using namespace boost::python;
>      def( "newDocument", myCadLib::pythonCommands::newDocument,
> arg("makeActive") );
> }
> ------- end of documentModule.cpp --------
>
> In reality the situation is more complicated and there are more dependencies
> than the one mentioned above.
> After generating a .so file with distutils, when I start my application and I
> attempt to load the module (.so file) in the embedded python shell I get an
> undefined symbols error complaining about the commandManager class.
> Of course this is a reasonable request from python and I understand that.
> However, I don't really care to generate a standalone python module per se. I
> just want it to work in my application's embedded python shell. Additionally,
> it wouldn't be meaningful to have the commandManager class exposed as well,
> since this is part of my applications internal structure.

Seems to me you want both extending and embedding. Never embedded an 
interpreter in a C++ app, so I'm not of much use here.
The two jobs should be fairly independent. Producing the .so to extend the 
interpreter needs to link the commandManager library.
Your extension module needs to access the Command Manager, so make sure it has 
already been initialized before the module is loaded, else the 
GetCommandManager() may return NULL.

-- 
             Giuseppe Corbelli
WASP Software Engineer, Copan Italia S.p.A
Phone: +390303666318  Fax: +390302659932
E-mail: giuseppe.corbelli at copanitalia.com


More information about the Cplusplus-sig mailing list