1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <boost/python.hpp>
#include <iostream>
#include <memory>
namespace bp = boost::python;
struct Base {
virtual void process() {
std::cout << "base" << std::endl;
}
virtual ~Base() {}
};
bp::object obj;
struct BaseWrapper: public Base, bp::wrapper< Base > {
BaseWrapper( PyObject* self_, Base const & b ) :
self( self_ ),
Base( b ),
bp::wrapper< Base >( ) {
Py_INCREF( self );
}
BaseWrapper(PyObject* self_) :
self( self_ ),
Base(),
bp::wrapper< Base >() {
Py_INCREF( self );
std::cout << "created!" << std::endl;
}
virtual void process() {
if( bp::override fct = this->get_override( "process" ) ) {
fct();
} else {
Base::process();
}
}
virtual ~BaseWrapper() {
std::cout << "destroyed!" << std::endl;
Py_DECREF(self);
}
PyObject* self;
};
void registerObject( bp::object o )
{
obj = o;
}
BOOST_PYTHON_MODULE( MyModule )
{
bp::class_< Base, std::auto_ptr< BaseWrapper > >( "Base" )
.def( "process", &Base::process );
def( "registerObject", registerObject );
}
int main( int argc, char ** argv ) {
try {
PyImport_AppendInittab( (char*)"MyModule", &initMyModule );
Py_Initialize();
bp::object main_module = bp::import("__main__");
bp::object MyModule = bp::import("MyModule");
bp::object main_namespace = main_module.attr("__dict__");
main_namespace["MyModule"] = MyModule;
bp::object result = bp::exec_file( "embedded.py", main_namespace );
} catch( bp::error_already_set const& ) {
PyErr_Print();
}
obj.attr("process")();
} |
Partager