J'ai un programme qui lors de son exécution doit parfois appeler python afin de préformer certaines tâches. J'ai besoin d'une fonction qui appelle python et attrape pythons stdout et le met dans un fichier. Ceci est une déclaration de la fonctionComment faire pour attraper python stdout dans le code C++
pythonCallBackFunc(const char* pythonInput)
Mon problème est d'attraper toute la sortie de python pour une commande donnée (pythonInput). Je n'ai aucune expérience avec API python et je ne sais pas quelle est la bonne technique pour le faire. La première chose que j'ai essayée est de rediriger le sdtout et le stderr de Python using Py_run_SimpleString ceci est un exemple du code que j'ai écrit.
#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;
}
Y a-t-il une meilleure façon de procéder? En outre, pour une raison quelconque PyRun_SimpleString ne fait rien lorsqu'il obtient une expression mathématique, par exemple PyRun_SimpleString ("5 ** 3") n'imprime rien (python conlsul affiche le résultat: 125)
peut-être que c'est important, j'utilise visuel studio 2008. Merci, Alex
changements que j'ai fait selon la suggestion de Mark:
#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;
}
La sortie je reçois après l'exécution principale:
Here's the output: 123
Here's the output:
Here's the output:
Here's the output: 2
Il est bon pour moi, mais un seul problème, il devrait être
Here's the output: 123
Here's the output: 6
Here's the output:
Here's the output: 2
Je ne sais pas pourquoi, mais après l'exécution de cette commande: PythonPrinting ("1 + 5"), PyString_AsString (sortie) La commande retourne une chaîne vide (char *) au lieu de 6 ... :(Y at-il quelque chose que je puisse faire pour ne pas perdre cette sortie?
Thaks, Alex
Les questions de programmation appartiennent à StackOverflow. –