我有一个程序,在它运行期间有时需要调用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 …
在切换到IPython v0.11(使用Python 2.6.1)之前,可以使用例如这样嵌入交互式IPython shell ,例如
from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell() # this call anywhere in your program will start IPython
Run Code Online (Sandbox Code Playgroud)
"嵌入式shell已被重构为一个名为InteractiveShellEmbed的InteractiveShell真正独立的子类.所有嵌入逻辑都已从基类中取出并放入嵌入式子类中"(参见此处和此处).
我理解它的方式你现在应该可以简单地启动一个控制台
import IPython
IPython.embed()
Run Code Online (Sandbox Code Playgroud)
然而,这提高了
TraitError:InteractiveShellEmbed实例的'exit_msg'特征必须是字符串,但指定了u''的值.
如果我们通过一个字符串exit_msg通过
IPython.embed(exit_msg='Whatever')
Run Code Online (Sandbox Code Playgroud)
然后它引发了一个不同的错误
AttributeError:'InteractiveShellEmbed'对象没有属性'set_completer'
有没有人遇到过这个问题?否则这可能是一个错误,因为它毕竟是开发人员版本.