действительно старый :) но спасибо

я есть программа, которой во время работы иногда нужно вызывать python, чтобы выполнить некоторые задачи. Мне нужна функция, которая вызывает Python иловит питонов и помещает это в некоторый файл. Это объявление функции

  pythonCallBackFunc(const char* pythonInput)

Моя проблема пойматьвесь вывод Python для данной команды (PythonInput). У меня нет опыта работы с Python API, и я не знаю, как правильно делать это. Первое, что я попробовал, это перенаправить sdtout и stderr в python, используя Py_run_SimpleString, это пример кода, который я написал.

#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;
}

Есть лучший способ сделать это? Кроме того, по какой-то причине PyRun_SimpleString ничего не делает, когда получает некоторое математическое выражение, например PyRun_SimpleString ("5 ** 3") ничего не печатает (python conlsul печатает результат: 125)

Может быть, это важно, я использую Visual Studio 2008. Спасибо, Алекс

Изменения, которые я сделал согласно предложению Марка:

  #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;
  }

Вывод, который я получаю после запуска main:

 Here's the output: 123

 Here's the output:
 Here's the output: 
 Here's the output: 2

Это хорошо для меня, но только одна проблема, это должно быть

 Here's the output: 123

 Here's the output: 6

 Here's the output: 
 Here's the output: 2

Я не знаю почему, но после запуска этой команды: PythonPrinting ("1 + 5"), команда PyString_AsString (output) возвращает пустую строку (char *) вместо 6 ... :( Есть что-то, что я могу сделать, чтобы не потерять это выход?

Такс, Алекс

Ответы на вопрос(3)

Ваш ответ на вопрос