C++ 调用 Python(通过Boost.Python)

本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起。

1. CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(test_boost_python LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Boost REQUIRED COMPONENTS python system)
include_directories( /usr/include/python3.8 ) # 笔者电脑上安装的是 Python 3.8

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} python3.8 )

2. main.cpp

#include <iostream>
#include <string>
#include <boost/python.hpp> // Boost.Python

int main(int argc, char* argv[])
{
    // 添加模块代码所在路径(Python脚本文件的路径)
    setenv("PYTHONPATH", ".", 1);

    Py_Initialize(); // 初始化 Python 解释器

    try
    {
        // 1. 导入模块 hello(hello.py)
        boost::python::object hello = boost::python::import("hello");

        // 2. 获取属性(函数、类等)
        boost::python::object greeting = hello.attr("greeting");

        // 3. 执行Python函数
        boost::python::object res = greeting("2022.04.23");
        // 其中第2步和第3步可以合并为
        // boost::python::object res = hello.attr("greeting")("2022.04.23");

        // 4. 打印返回结果(使用 boost::python::extract 转换)
        std::string tmp = boost::python::extract<std::string>(res);
        std::cout << tmp << " ... C++" << std::endl;
    }
    catch (const boost::python::error_already_set&)
    {
        PyErr_Print();
        return 1;
    }

    Py_Finalize(); // 终止 Python 解释器

    return 0;
}

3. hello.py

def greeting( val ):
    print("Hello world from Python...",val," \n")
    return "WOAINI"

4. 运行结果

main.cpp第 8 行代码指定 Python 文件要放置在当前路径(工作目录)下。程序运行结果如下
image


参考资料
How to import a function from python file by Boost.Python
Boost::Python Extract -- Accessing Python string in C++
Boost Python Python return value to C++ program

posted @ 2022-04-23 20:40  Fitanium  阅读(1101)  评论(0编辑  收藏  举报