[C++-sig] Uh-oh now I am trying boost python embedding

Simon Pickles sipickles at googlemail.com
Thu Jun 25 22:52:44 CEST 2009


Hi

I've got an embedded python system up and running, for evaluation purposes.

I am able to expose c++ modules to python, create c++ classes in python, 
and extract and use those python types in c++! Cool!

However, what if I want to pass a c++ type to a python class? Is there 
some way to covnert my class, Logger in this case, to an bpy object, or 
some other way?

Here's my code:

// main.cpp
#include <iostream>
#include <boost/python.hpp>
#include <boost/detail/lightweight_test.hpp>
#include "../logger/logger.h"

using namespace boost::python;
using namespace std;

BOOST_PYTHON_MODULE(hybrid)
{
    class_<Logger, boost::noncopyable>("Logger")
        .def("StartLogToFile", &Logger::StartLogToFile)
        .def("SYS", &Logger::SYS)
        ;
}

int main(int, char **)
{
    Py_Initialize();
    try
    {
        // Get main module and namespace
        object 
pyModule_main(handle<>(borrowed(PyImport_AddModule("__main__"))));
        object pyNamespace_main = pyModule_main.attr("__dict__");

        // expose boost python modules
        inithybrid();
        exec("print 'Embedded python....'\n", m_pyNamespace_main);    
       
       
        // import another module
        object pyModule_test = import("test");
        object pyNamespace_test = pyModule_test.attr("__dict__");       

        // c++ object, creating in python, extracted and used in c++! 
THIS WORKS
        Logger* log = extract<Logger*>(pyNamespace_test["pyLogger"]);
        log->SYS("C++ using an object created in python embedded in 
c++!", 0);

        Logger* cppLogger = new Logger;
        cppLogger->StartLogToFile("cppLog.txt");
        //Push c++ logger into python namespace THIS DOESN'T!
        pyNamespace_test["logger"] = cppLogger;

        object ignored = exec("useCppLogger()", m_pyNamespace_test, 
m_pyNamespace_test);

    }
    catch (error_already_set)
    {
        PyErr_Print();
    }

    delete cppLogger;
}


# test.py
import hybrid
pyLogger = hybrid.Logger()
pyLogger.StartLogToFile("pyLogger.txt")
pyLogger.SYS("Python using a python Logger. wow...")

def useCppLogger():
    # cppLogger has been pushed into module namespace by c++
    global cppLogger
    cppLogger.SYS("Python using a Logger class passed from c++")

#

Thanks for any help!

Simon




More information about the Cplusplus-sig mailing list