我有一个程序,在它运行期间有时需要调用 python 来执行一些任务。我需要一个调用 python 并捕获 python 标准输出并将其放入某个文件的函数。这是函数的声明
pythonCallBackFunc(const char* pythonInput)
我的问题是捕获给定命令(pythonInput)的所有python输出。我没有使用 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") 什么也不打印(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'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... :( 有什么我可以做的吗?输出?
谢谢,亚历克斯