I have a program which during it's run sometimes needs to call python in order to preform some tasks. I need a function that calls python and catches pythons stdout and puts it in some file. This is a declaration of the function
  pythonCallBackFunc(const char* pythonInput)
My problem is to catch all the python output for a given command (pythonInput). I have no experience with python API and I don't know what is the right technique to do this. First thing I've tried is to redirect python's sdtout and stderr using Py_run_SimpleString this is some example of the code i've written.
#include "boost\python.hpp"
#include <iostream>
void pythonCallBackFunc(const char* inputStr){   
    PyRun_SimpleString(inputStr); 
}
int main () {
    ...
   //S0me outside functions does this
   Py_Initialize();
   PyRun_SimpleString("import sys");
   PyRun_SimpleString("old_stdout = sys.stdout");
   PyRun_SimpleString("fsock = open('python_out.log','a')");
   PyRun_SimpleString("sys.stdout = fsock");
   ...
   //my func   
   pythonCallBackFunc("print 'HAHAHAHAHA'");
   pythonCallBackFunc("result = 5");
   pythonCallBackFunc("print result");
   pythonCallBackFunc("result = 'Hello '+'World!'");
   pythonCallBackFunc("print result");
   pythonCallBackFunc("'KUKU '+'KAKA'");
   pythonCallBackFunc("5**3");
   pythonCallBackFunc("prinhghult");
   pythonCallBackFunc("execfile('stdout_close.py')");
   ... 
   //Again anothers function code
   PyRun_SimpleString("sys.stdout = old_stdout");
   PyRun_SimpleString("fsock.close()");
   Py_Finalize();
   return 0;
}
Is there a better way to do this? Besides, for some reason PyRun_SimpleString does nothing when it gets some mathematical expression, for example PyRun_SimpleString("5**3") prints nothing (python conlsul prints the result: 125)
maybe it is important, i am using visual studio 2008. Thanks, Alex
Changes I've made according Mark's suggestion:
  #include <python.h>
  #include <string>
  using namespace std;
  void PythonPrinting(string inputStr){ 
     string stdOutErr =
    "import sys\n\
     class CatchOut:\n\
        def __init__(self):\n\
           self.value = ''\n\
        def write(self, txt):\n\
           self.value += txt\n\
     catchOut = CatchOut()\n\
     sys.stdout = catchOut\n\
     sys.stderr = catchOut\n\
    "; //this is python code to redirect stdouts/stderr
     PyObject *pModule = PyImport_AddModule("__main__"); //create main module
     PyRun_SimpleString(stdOutErr.c_str()); //invoke code to redirect
     PyRun_SimpleString(inputStr.c_str());
     PyObject *catcher = PyObject_GetAttrString(pModule,"catchOut");
     PyObject *output = PyObject_GetAttrString(catcher,"value");
     printf("Here's the output: %s\n", PyString_AsString(output)); 
     }
  int main(int argc, char** argv){
         Py_Initialize();
     PythonPrinting("print 123");
     PythonPrinting("1+5");
     PythonPrinting("result = 2");
         PythonPrinting("print result");
         Py_Finalize();
         return 0;
  }
The output i get after running main:
 Here's the output: 123
 Here's the output:
 Here's the output: 
 Here's the output: 2
It is good for me , but only one problem, it should be
 Here's the output: 123
 Here's the output: 6
 Here's the output: 
 Here's the output: 2
I dont know why but after running this command: PythonPrinting("1+5"), PyString_AsString(output) command returns an empty string (char*) instead of 6... :( Is there somthing i can do not to loose this output?
Thaks, Alex
 
     
     
     
     
    