31

我想从 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 文件(同一脚本的一部分)。

示例:我有一个包含100 个条目training.csv的文件。我调用了 Python 脚本,对脚本几乎没有更改,因此文件现在应该只包含 50 个条目而不是 100 个条目。它被覆盖了。然而,没有这样的事情发生。脚本中的其余命令(等)运行良好。training.csvprint

training.csv文件将使用 C++ 读取,通常使用fstreamgetline

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

4

2 回答 2

28

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

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

于 2013-06-06T13:18:50.947 回答
8

Try using POSIX's popen() instead of system(). It pipes stdin/stdout of child process to returned file handle.

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

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

pclose(in);
于 2013-06-06T13:37:33.210 回答