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

Calling Python script from C++ and using its output

本文关键字:输出 脚本 c++ 调用 Python      更新时间:2023-10-16

我想从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文件是用c++读的,通常使用fstreamgetline

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

这是一个从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()

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

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

FILE* in = popen(command.c_str(), "r");
fscanf(in, ... // or some other method of reading
pclose(in);