python调用C++代码例子

发布时间:2023年12月19日

my_module.cpp

#define PY_SSIZE_T_CLEAN
#define BOOST_PYTHON_MODULE_NAME my_module
//#include <pybind11/pybind11.h>
#include <boost/python.hpp>

int add(int a, int b) {
    return a + b;
}

//PYBIND11_MODULE(libmy_module, m) {
//    m.def("add", &add, "Prints a greeting from C++");
//}

BOOST_PYTHON_MODULE(libmy_module) {
    using namespace boost::python;
    def("add", add);
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(kalibr-example)

# 查找 Boost.Python
find_package(Boost REQUIRED COMPONENTS python)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

set(Python_ADDITIONAL_VERSIONS 3.11)  # 替换为您的 Python 版本
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
#
#set(pybind11_DIR /home/local/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11/)
#find_package(pybind11 REQUIRED)

add_library(my_module MODULE my_module.cpp)
#target_link_libraries(my_module PRIVATE pybind11::module)
target_link_libraries(my_module PRIVATE Boost::python)

python :main.py

import sys
import libmy_module
result = libmy_module.add(1, 2)
print ("result:{}".format(result))

出现的一个报错:

原因分析:

cmake生成的动态库名字为libmy_module.so

要和cpp代码中红框处的变量名保持一致才行

Boost.Python和pybind11区别

Boost.Python和pybind11都是用于在C++和Python之间进行绑定的工具,它们有一些区别和特点:

  1. 依赖性: Boost.Python是Boost库的一部分,因此使用Boost.Python需要安装和配置Boost库。而pybind11是一个独立的库,没有额外的依赖项,更容易使用和集成到项目中。

  2. 代码复杂性: Boost.Python在绑定C++和Python之间的交互时,使用了大量的宏和模板代码。这些代码可以让绑定变得更复杂,尤其对于大型项目来说。而pybind11使用更现代的C++特性,如类型推断和Lambda函数,使代码更简洁和易读。

  3. 性能: pybind11在性能方面通常比Boost.Python更好,因为pybind11使用了更优化的Python/C++ API调用和类型转换机制,同时也提供了更好的内存管理和异常处理。

  4. 语法风格: Boost.Python使用了一种更传统的C++风格的语法,包括宏定义和模板元编程。而pybind11使用了更现代的C++特性,如类型推断和Lambda函数,更接近于原生的C++编程风格。

总体而言,pybind11是一个相对较新、更简单和更高效的C++和Python绑定库,而Boost.Python则是一个更成熟和功能丰富的库。选择使用哪个库取决于项目的需求、开发团队的偏好以及与其他依赖项的集成等因素。

文章来源:https://blog.csdn.net/lin_FS/article/details/134981241
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。