从C ++调用Python脚本并使用其输出

时间:2013-06-06 12:44:01

标签: python c++ python-3.x python-2.7

我想从C ++调用python脚本,并希望将此脚本生成的输出.csv文件重新用于C ++。我在main()中试过这个:

std::string filename = "/home/abc/xyz/script.py";
std::string command = "python ";
command += filename;
system(command.c_str());

这会调用并执行python脚本。

正在执行Python中的print命令。调用脚本时,屏幕上会打印出一些内容。到现在为止还挺好。但是,它不会创建.csv文件(同一脚本的一部分)。

示例:我的training.csv文件包含 100个条目。我调用了Python脚本,对脚本进行了少量更改,因此training.csv文件现在应该只包含50个条目而不是100个。它被覆盖了。然而,没有发生这样的事情。脚本中的其他命令(print等)工作正常。

使用training.csvfstream通常使用C ++读取getline文件。

知道怎么做(使用Linux)?

2 个答案:

答案 0 :(得分:18)

这是一个从C ++应用程序中嵌入python模块执行的解决方案。它并不比通过系统调用分支/执行你的python脚本更好或更差,它只是一种不同的方式。是否最佳取决于您的背景和使用情况。

前段时间我编写了一种将python模块作为插件加载到C ++应用程序的方法,这里是interesting part

基本上,你需要#include <Python.h>,然后Py_Initialize()来启动你的python解释器。

然后您使用import sys执行PyRun_SimpleString("import sys");,然后您可以通过PyRun_SimpleString('sys.path.append("path/to/my/module/")')加载插件。

要在C ++和Python之间交换值,事情会变得更加困难,你必须将所有C ++对象转换为python对象(在我的脚本中从第69行开始)。

然后你可以使用PyObject_Call_Object(...)调用你的函数,使用你创建的所有python对象作为参数。

获取返回值,并转换C ++对象中的所有值。并且不要忘记所有的内存管理!

要结束你的python解释器,只需调用Py_Finalize()

它看起来真的比实际看起来更难,但你必须非常小心这样做,因为它可能导致泄漏,安全问题等。

答案 1 :(得分:6)

尝试使用POSIX的popen()代替system()。它将子进程的stdin / stdout传递给返回的文件句柄。

FILE* in = popen(command.c_str(), "r");

fscanf(in, ... // or some other method of reading

pclose(in);