我有一个程序,在它运行期间有时需要调用python来执行某些任务.我需要一个调用python并捕获pythons stdout并将其放入某个文件的函数.这是函数的声明
pythonCallBackFunc(const char* pythonInput)
Run Code Online (Sandbox Code Playgroud)
我的问题是捕获给定命令(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;
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?此外,由于某种原因PyRun_SimpleString在得到一些数学表达式时什么都不做,例如PyRun_SimpleString("5**3")什么都不打印(python …
我想记录Python脚本的所有输出.我试过了:
import sys
log = []
class writer(object):
def write(self, data):
log.append(data)
sys.stdout = writer()
sys.stderr = writer()
Run Code Online (Sandbox Code Playgroud)
现在,如果我"打印'某些东西'"它就会被记录下来.但是,如果我做了一些语法错误,比如说"打印'某些东西#",它就不会被记录 - 它将进入控制台.
我如何捕获Python解释器中的错误?
我看到了一个可能的解决方案:
http://www.velocityreviews.com/forums/showpost.php?p=1868822&postcount=3
但第二个例子登录到/ dev/null - 这不是我想要的.我想将它记录到像我上面的例子或StringIO这样的列表中......
另外,我最好不要创建子进程(并在单独的线程中读取它的stdout和stderr).