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

lea*_*ner 23 c++ python python-2.7 python-3.x

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

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

这会调用并执行python脚本.

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

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

training.csv文件是用C++通常使用来读取fstreamgetline.

知道怎么做(使用Linux)吗?

zmo*_*zmo 21

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

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

基本上,你需要#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().

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


Vov*_*ium 6

尝试使用POSIX popen()而不是system().它将子进程的stdin/stdout传递给返回的文件句柄.

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

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

pclose(in);
Run Code Online (Sandbox Code Playgroud)