我有一个程序,在运行过程中有时需要调用python才能执行某些任务。我需要一个调用python并 捕获pythons stdout
并将其放入某个文件的函数。这是函数的声明
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 Studio2008。谢谢,Alex
我根据Mark的建议进行了更改:
#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 …::(有什么我不能放松的地方吗?输出?
塞克斯(Alex)
如果我正确地阅读了您的问题,您想将stdout / stderr捕获到C
中的变量中吗?您可以通过将stdout /
stderr重定向到python变量,然后将此变量查询到C
中来实现。请不要说我没有在下面做适当的引用计数:
#include <Python.h>
#include <string>
int main(int argc, char** argv)
{
std::string stdOutErr =
"import sys\n\
class CatchOutErr:\n\
def __init__(self):\n\
self.value = ''\n\
def write(self, txt):\n\
self.value += txt\n\
catchOutErr = CatchOutErr()\n\
sys.stdout = catchOutErr\n\
sys.stderr = catchOutErr\n\
"; //this is python code to redirect stdouts/stderr
Py_Initialize();
PyObject *pModule = PyImport_AddModule("__main__"); //create main module
PyRun_SimpleString(stdOutErr.c_str()); //invoke code to redirect
PyRun_SimpleString("print(1+1)"); //this is ok stdout
PyRun_SimpleString("1+a"); //this creates an error
PyObject *catcher = PyObject_GetAttrString(pModule,"catchOutErr"); //get our catchOutErr created above
PyErr_Print(); //make python print any errors
PyObject *output = PyObject_GetAttrString(catcher,"value"); //get the stdout and stderr from our catchOutErr object
printf("Here's the output:\n %s", PyString_AsString(output)); //it's not in our C++ portion
Py_Finalize();
return 0;
}
问题内容: 我正在使用以下代码使用nodejs和ssh2模块在Linux机器上重置密码: 我正在从另一个模块(如下所示的test.js)调用resetPassword密码功能。 但是console.log说“未定义”。尝试使用process.nextTick,但没有运气。请帮忙。 问题答案: 欢迎来到node.js中使用异步操作进行开发的世界。最初学习node.js时,这是一个非常常见的错误(也是
我正在使用一个控制台应用程序和非常基本的Tesseract来执行数字识别。我从谷歌复制了一个图像,试图找到数字只。
问题内容: 以下catch()不被调用: 有没有办法捕获这种异常? 问题答案: 请检查 http://linux.die.net/man/1/gcc中 有一个编译器选项-mcheck-zero-division来处理。 另外,也可以选择安装SIGFPE处理程序,然后将float div乘以0将生成一个’FPE_ZERODIVIDE’ 以来 大多数浮点系统基于IEEE标准,该标准允许除以0。这会根据
问题内容: 我正在研究启动多个进程和数据库连接的python脚本。我不时地想用信号杀死脚本,我想进行一些清理。 在Perl中,我可以这样做: 如何在Python中做类似的事情? 问题答案: 用以下方式注册你的处理程序: 代码改编自此处。
我对JavaScript文件中的API(Node.js中运行的npm模块)进行了以下调用,我希望在其中捕获所有错误,以便能够优雅地处理它们。但是,如果(例如)传递了一个错误的API-KEY或一个不存在的城市名称,则该API的内部代码中存在一个错误,该错误未被try/catch捕获: 相反,显示错误并停止执行: JavaScript中是否有一种方法可以像Java和C中那样捕获所有错误?
问题内容: 发现在Java 1.6(以及从Eclipse)上运行时,吞没了该方法中的异常之后,我试图找到一种捕获这些异常的方法,而不会在我的所有实现中都添加throw / catch 。 该API建议覆盖应对此有所帮助: 导致此future报告一个ExecutionException,并以给定throwable作为其原因,除非已经设置或取消了此Future。计算失败时,run方法在内部调用此方法。