У меня есть программа, которая во время ее выполнения иногда требует вызова python, чтобы выполнить некоторые задачи. Мне нужна функция, которая вызывает python и ловит pythons stdout и помещает ее в некоторый файл. Это объявление функции
pythonCallBackFunc(const char* pythonInput)
Моя проблема - поймать весь вывод python для данной команды (pythonInput). У меня нет опыта работы с API-интерфейсом python, и я не знаю, какова правильная техника для этого. Первое, что я пробовал, - перенаправить python sdtout и stderr с помощью 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. Благодаря, Alex
Изменения, внесенные мной по предложению Марка:
#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 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 the output: 123
Here the output:
Here the output:
Here the output: 2
Это хорошо для меня, но только одна проблема, это должно быть
Here the output: 123
Here the output: 6
Here the output:
Here the output: 2
Я не знаю, почему, но после выполнения этой команды: PythonPrinting ( "1 + 5" ), команда PyString_AsString (output) возвращает пустую строку (char *) вместо 6...:( Есть ли что-нибудь, что я могу не потерять этот выход?
Thaks, Alex