看pybind11的官方文档
1.这是一个全部为头文件的库,所用使用简单,可直接从github下载这个项目
2. 需要有两个文件,一个是你定义的class类,一个是python绑定的cpp文件
- #include
-
- 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编译
可以构建这样的目录结构
- |-- 3rdparty
- | |-- pybind11
- -- Chun
- | |-- chun.h
- -- PyChun
- | |-- src/pychun.cpp
- | |-- CMakeLists.txt
- | |-- chun.py
- -- example
- | |-- test.py
- 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