pybind11

看pybind11的官方文档

1.这是一个全部为头文件的库,所用使用简单,可直接从github下载这个项目

2. 需要有两个文件,一个是你定义的class类,一个是python绑定的cpp文件

#include <pybind11/pybind11.h>

int add(int i, int j){ return i + j;}


PYBIND11_MODULE(example, m){
    m.doc() = "pybind11 example plugin"; // optional module docstring
    m.def("add", &add, "A function that adds two numbers");
}

单个文件编译

单个文件的编译很简单,主要是加pybind11的include和python的include,编成一个动态库,注意动态库的命名要和module的一致

c++ --shared -fPIC a.cpp -o example.so -I ../3rdparty/pybind11/include/ $(python3-config --includes)

我一开始编译成a.so, 然后在python里import a,报错“ImportError: dynamic module does not define module export function (PyInit_a)”,就是这个动态库没有定义a module,想起来我源码里面module叫example,于是重新编译example.so. 现在可以了

CMAKE编译

也可以通过cmake编译

可以构建这样的目录结构

|-- 3rdparty
|   |-- pybind11
-- Chun
|   |-- chun.h
-- PyChun
|   |-- src/pychun.cpp
|   |-- CMakeLists.txt
|   |-- chun.py
-- example
|   |-- test.py
  • chun.h定义你原理的结构
  • pychun.cpp定义这个module封装
  • 编译是通过在pychun目录下,mkdir build, cd build, cmake ..  make,会在build/生成一个module.so
  • chun.py是拿这个module.so的东西进行进一步在python端封装其他接口
  • test.py运行的目录下需要有那个so, 如果没有,需要自己加路径 sys.path.append()
cmake_minimum_required(VERSION 2.8)
project(xxx)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fPIC)

include_directories("${PROJECT_SOURCE_DIR}/../3rdparty/pybind11/include")

include_directories("${PROJECT_SOURCE_DIR}/../chun")

set(Python3_EXECUTABLE python3)
execute_process(
    COMMAND bash -c "${Python3_EXECUTABLE} -c 'import sysconfig; print(sysconfig.get_path(\"include\"))'"
    OUTPUT_VARIABLE PYTHON_INCLUDES
)
include_directories(${PYTHON_INCLUDES})

FILE(GLOB_RECURSE MODULE_SRCS ${PROJECT_SOURCE_DIR}/**.cpp)
set(modulename "example")
add_library(${modulename} SHARED ${MODULE_SRCS})
SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")
target_link_libraries(${modulename})

需要注意的是,这里生成的so会默认带前缀,这里要把前缀去掉,才和module名称一致

SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")

然后在这个so的目录下,就可以

>>>import example

>>>example.add(1,2)

>>>3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值