Pass pointer from C++ class to Boost Python script ?!!!

David Rostowsky david_rostowsky at yahoo.com
Sun Mar 28 19:48:45 CEST 2004


Im a newbie to Boost and Python and need some help.

I have a C++ class:

class TestC
{
protected:
    int x;

public:
    TestC() { x = 0; };
    void Set(int val) { x = val; };
    int Get(void) { return x; };
};

In my C++ code I want to allocate an instance of TestC:
TestC * my_ptr = new TestC();

Now, I want to run a Boost Python script from inside my C++ code and
pass the address of my_ptr to the script such that the script can call
any of my classes public member functions like this:

# my python script. I know the syntax is probably not right, thats why
I need help! This is test_script.py referenced in c++ code below.
def my_script(addr_of_my_ptr):
    addr_of_my_ptr.Set(9)
    x = addr_of_my_ptr.Get()
    print x
    return 0;

So, in my C++ code, Ive been trying to do stuff like below, but with
no luck... I know I need some wacky Boost syntax to expose the class
to the Python script (I definitely need help there too). Everything
works right up until PyObject_CallObject where it crashes and burns. I
cant decode the Boost documentation properly to find the right amount
of cryptic code to use to make this work right. HELP!!!

int main()
{
    Py_Initialize();
	
    // load the module
    PyObject * module = PyImport_ImportModule("test_script");

    // dictionary of module
    PyObject * dict = PyModule_GetDict(module);

    // get a pointer to the function in the script
    PyObject * func = PyDict_GetItemString(dict, "my_script");

    // call the function
    TestC * my_ptr = new TestC();
    PyObject * pyobj = Py_BuildValue("O", my_ptr);

    // make a tuple of arguments (the numbers 2 and 3)
    PyObject *arguments = PyTuple_New(1);
    PyTuple_SetItem(arguments, 0, Py_BuildValue("O", my_ptr));

    PyObject * result = PyObject_CallObject(func, arguments);

    // show the result
    printf("Result of call: %ld\n", PyInt_AsLong(result));

    // clean up
    Py_DECREF(result);
    Py_DECREF(module);

    Py_Finalize();

    return 0;
}



More information about the Python-list mailing list