我有一個程序,它在運行過程中有時需要調用python才能執行一些任務。我需要一個函數調用python和捕捉pythons stdout並將其放入某個文件。 這是函數如何在C++代碼中捕捉python標準輸出
pythonCallBackFunc(const char* pythonInput)
我的問題是趕上所有給定命令(pythonInput)蟒蛇輸出的聲明。 我沒有使用Python API的經驗,我不知道什麼是正確的技術來做到這一點。 我試過的第一件事就是使用Py_run_SimpleString重定向python的sdtout和stderr,這是我寫的代碼的一些例子。
#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」)打印無(蟒蛇conlsul打印出結果:125)
也許是很重要的,我使用的視覺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;
}
輸出運行主後,我得到:
這是爲我好,但只有一個問題,它應該是
Here's the output: 123
Here's the output: 6
Here's the output:
Here's the output: 2
我不知道爲什麼,但在運行此命令後:PythonPrinting( 「1 + 5」),PyString_AsString(輸出)命令返回一個空字符串(char *)而不是6 ... :(有沒有什麼我可以不放鬆這個輸出?
Thaks, 亞歷
編程問題屬於在計算器上。 – 2010-11-29 19:11:46