[C++-sig] embedding an extended python module

Daniel Lawson daniel at wand.net.nz
Wed Jan 12 10:40:59 CET 2005


Hi there,

I'm using Boost:Python to extend Python, in order to provide access to 
some C++ classes I have written. This is working fine - I can load the 
resulting module in Python, instantiate the classes exported via Boost, 
and manipulate them and so on.

typedef std::map<std::string ,Attr *> attrmap;
class Node {
    std::string name;
    attrmap attrs;
   
    public:
    Node(std::string name);
    ~Node();
    void addAttr(std::string key, int val);
    void getAttr(std::string key);
}

BOOST_PYTHON_MODULE(Node)
{
    using namespace boost::python;
    class_<Node>("Node",init<std::string>())
        .def("addAttr", &Node::addAttr)
        .def("getAttr", &Node::getAttr)
    ;
}

I also have a program which has embedded Python in it. This program can 
be passed the names of some python files, which it will load and import 
specific symbols from:

    filtername = "filter.py";
    pName = PyString_FromString(filtermod);
    pfilterhnd = PyImport_Import(pName);
    pDict = PyModule_GetDict(pfilterhnd);
    pfilter = PyDict_GetItemString(pDict, "filter");
   

And so on. Later on, I then call this filter function:

    pName = PyString_FromString("name");
    pNode = PyString_FromString("node");
    pArgs = PyTuple_New(2);
    PyTuple_SetItem(pArgs, 0, pName);
    PyTuple_SetItem(pArgs, 1, pNode);
    pRetVal = PyObject_CallObject(phandler,pArgs);
    ...

Where pArgs is a tuple of arguments.


This works fine, as long as I only pass basic Python types to the 
function - eg, strings (PyString_FromString), longs (PyInt_FromLong) etc.

However, I want to be able to pass, into the embedded python, instances 
(pointers to, actually) the classes which I have exported via Boost. 
More so, I want the python module I loaded above to be able to modify 
the datastructure, and have the calling program make use of this.


I've imported the appropriate modules into the python interpreter 
embedded into my C++ program.


 From what I've read, within the calling C++ program I need to convert 
(or wrap) the instance of my Node class into a PyObject *. Once I've 
done that, I can use PyObject_Callfunction or similar to call the python 
function, passing my Node class into it. Once in there, python will use 
the boost-extended module to access it.

I've been reading mailing lists all day, it seems like this should be 
very possible, I'm just totally stumped as to how. There's plenty of 
examples for embedding python into a C/C++ program, and there's plenty 
of examples for extending python with a C/C++ extension, but there don't 
seem to be so many which put the two together.

Thanks,

Daniel



More information about the Cplusplus-sig mailing list