从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出

Posted

技术标签:

【中文标题】从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出【英文标题】:Running python script from c++ code and use pythons output in c++ 【发布时间】:2020-09-23 07:28:02 【问题描述】:

我有一个 C++ 程序,它已经非常成熟,可以完成它自己的工作,现在我们想为其添加一个附加功能,我们认为在 Python 中创建所述功能,然后使用所需的输入调用该 python在需要时使用 C++ 是最好的方法,因为它可以将它们分开,并允许我们也可以从其他地方使用这个 python 脚本。

作为第一步,我决定尝试制作一个测试程序,看看它是如何工作的,这似乎是个好主意,因为我无法让它工作。

如何从 c++ 运行单独的 python?

我已经尝试关注this guide,虽然它看起来不错,但没有提供任何关于我应该使用哪些编译器选项运行它的信息?

我有两个文件,cpp.cpp 和 python.py

这是我的 cpp.cpp 文件:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <ncurses.h>
#include <Python.h>

using namespace std;

int main() 

    std::cout << "C++ program started!\n";
    
    char filename[] = "python.py";
    FILE* fp;
    
    Py_Initialize();
    
    fp = _Py_fopen(filename, "r");
    PyRun_SimpleFile(fp, filename);
    
    Py_Finalize();
    
    std::cout << "C++ program is ending!\n";
    return 0;

而我的 python 文件只有两个 printf 行:

#print('External Python program running...')
#print('Hello World from Python program')

然后我尝试编译它,给它所有它似乎想要的包含,然后执行输出文件:

g++ -I . -I /home/ahomm/python3.6/Include -I /home/ahomm/python3.6/release cpp.cpp && ./a.out

这是我得到的输出:

/tmp/cccQsh1p.o: In function `main':
cpp.cpp:(.text+0x3f): undefined reference to `Py_Initialize'
cpp.cpp:(.text+0x52): undefined reference to `_Py_fopen'
cpp.cpp:(.text+0x70): undefined reference to `PyRun_SimpleFileExFlags'
cpp.cpp:(.text+0x75): undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status

我错过了什么?只是有点或完全错误? cpp 和 py 文件位于同一目录中。

然后我如何在 C++ 中读取 python 的输出?还没到那一步……

【问题讨论】:

【参考方案1】:

您必须将您的代码与 libpython3.x.a/python3.x.lib(x - 您使用的 python 版本)链接起来。链接哪个文件:*.a 或 *.lib 取决于您的操作系统。这些文件在 python 发行版中可用。

这是一个适用于我的 cmake 代码:

cmake_minimum_required(VERSION 2.8.9)
project (embpy)
add_executable(embpy embpy.cpp)
target_include_directories(embpy PRIVATE /path-to-python/Python38/include/python3.8)
target_link_libraries(embpy /path-to-python/Python38/lib/libpython3.8.a)

embpy.cpp 和你的一样

【讨论】:

我该怎么做?我正在 WSL 环境中开发它,所以在 ubuntu 上。 您使用什么作为构建工具?制作?制作? cmake 或 make,如果你知道如何让其中一个工作,那很好。【参考方案2】:

后来自己想通了,问题是编译器参数不完整。

这就是我的工作原理:

g++ -fPIC $(python3.6-config --cflags) cpp.cpp $(python3.6-config --ldflags)

关键缺失部分是要编译的文件之前的$(python3.6-config --cflags) 和之后的$(python3.6-config --ldflags)。第一个为 g++ 提供编译选项,后者为链接提供标志。

从python docs 找到解决方案,第 1.6 部分。

【讨论】:

以上是关于从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出的主要内容,如果未能解决你的问题,请参考以下文章

从C ++运行python脚本时内存泄漏

将数据从套接字从C ++服务器发送到Python客户端时出现问题

让 Java 与 Python、C、C++ 和 Ruby 对话

将python脚本添加到c ++项目

从python运行程序,并在脚本被杀死后继续运行

从 Visual Studio C++ 解决方案调用 Python 脚本