[C++-sig] getting result from the interpreter -- boost-python

Benjamin Collar collar at gamic.com
Tue Oct 14 11:21:39 CEST 2003


Yesterday I posted a question that hasn't been commented on until now...No 
problem. It was kind of a messy question anyway.

I've sort of found an answer. However, the example in the documentation does 
not work properly in my environment. Here's the example:

    handle<> main_module(borrowed( PyImport_AddModule("__main__") ));
    dict main_namespace(handle<>(borrowed( PyModule_GetDict(main_module.get()) 
    handle<>( PyRun_String("result = 5 ** 2", Py_file_input,
                           main_namespace.ptr(), main_namespace.ptr()) );
    int five_squared = extract<int>( main_namespace["result"] );

This will not compile:
  main.cc: In function `int main(int, char**)':
  main.cc:33: error: variable declaration is not allowed here
  main.cc:35: error: request for member `ptr' in `main_namespace()', which is 
of non-aggregate type `boost::python::dict ()()'
  main.cc:35: error: request for member `ptr' in `main_namespace()', which is 
of non-aggregate type `boost::python::dict ()()'
  main.cc:36: error: invalid types `boost::python::dict ()()[const char[7]]' 
for array subscript

I can get it to compile if I dereference the handle<> when declaring 
main_namespace--but then it throws and exception.  What I have below will 
compile and gives me the right result but seems messy and perhaps leaks?  If 
someone could tell me the 'right' way to do this, I'd appreciate it:

    handle<> main_module(borrowed( PyImport_AddModule("__main__") ));
    handle<> main_namespace(borrowed( PyModule_GetDict(main_module.get()) ));
    handle<> rs( PyRun_File(fp, const_cast<char *>("test.py")),
      Py_file_input, main_namespace.get(), main_namespace.get()));
    object x(main_namespace);
    dict m_n = extract<dict>(x);
    int pi = extract<int>(m_n["i"]);

Thanks again


(o__      Benjamin Collar
//\       GAMIC mbH  ++49 (0)241 889 110
V_/_      Developer/System Administrator 

To know recursion, you must first know recursion

More information about the Cplusplus-sig mailing list