我想从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.csv
和fstream
通常使用C ++读取getline
文件。
知道怎么做(使用Linux)?
答案 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);