相关疑难解决方法(0)

如何在c ++代码中捕获python stdout

我有一个程序,在它运行期间有时需要调用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 …

c++ python redirect python-embedding python-c-api

25
推荐指数
3
解决办法
1万
查看次数

在IPython中嵌入式交互式shell

在切换到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已被重构为一个名为InteractiveShellEmbedInteractiveShell真正独立的子类.所有嵌入逻辑都已从基类中取出并放入嵌入式子类中"(参见此处此处).

我理解它的方式你现在应该可以简单地启动一个控制台

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'

有没有人遇到过这个问题?否则这可能是一个错误,因为它毕竟是开发人员版本.

python embed ipython

6
推荐指数
2
解决办法
1万
查看次数

标签 统计

python ×2

c++ ×1

embed ×1

ipython ×1

python-c-api ×1

python-embedding ×1

redirect ×1