• pybind11


    看pybind11的官方文档

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

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

    1. #include
    2. int add(int i, int j){ return i + j;}
    3. PYBIND11_MODULE(example, m){
    4.     m.doc() = "pybind11 example plugin"; // optional module docstring
    5.     m.def("add", &add, "A function that adds two numbers");
    6. }

    单个文件编译

    单个文件的编译很简单,主要是加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编译

    可以构建这样的目录结构

    1. |-- 3rdparty
    2. | |-- pybind11
    3. -- Chun
    4. | |-- chun.h
    5. -- PyChun
    6. | |-- src/pychun.cpp
    7. | |-- CMakeLists.txt
    8. | |-- chun.py
    9. -- example
    10. | |-- 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()
    1. cmake_minimum_required(VERSION 2.8)
    2. project(xxx)
    3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC)
    4. include_directories("${PROJECT_SOURCE_DIR}/../3rdparty/pybind11/include")
    5. include_directories("${PROJECT_SOURCE_DIR}/../chun")
    6. set(Python3_EXECUTABLE python3)
    7. execute_process(
    8. COMMAND bash -c "${Python3_EXECUTABLE} -c 'import sysconfig; print(sysconfig.get_path(\"include\"))'"
    9. OUTPUT_VARIABLE PYTHON_INCLUDES
    10. )
    11. include_directories(${PYTHON_INCLUDES})
    12. FILE(GLOB_RECURSE MODULE_SRCS ${PROJECT_SOURCE_DIR}/**.cpp)
    13. set(modulename "example")
    14. add_library(${modulename} SHARED ${MODULE_SRCS})
    15. SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")
    16. target_link_libraries(${modulename})

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

    SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")

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

    >>>import example

    >>>example.add(1,2)

    >>>3

  • 相关阅读:
    【数学建模暑期培训】配送中心选址问题
    2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression
    深度剖析:数字经济下人工智能水平的新测算模型数据集
    ffmpeg转YUV打死都不行
    Python简介-Python3及环境配置
    使用 SAP UI5 sap.ui.export.Spreadsheet API 进行 Excel 导出的一些限制
    软考高级架构师下篇-16通信系统架构设计理论与实践
    网关(Gateway)- 自定义过滤器工厂
    Programming Languages PartA Week3学习笔记——SML基本语法第二部分
    短视频矩阵系统,抖音矩阵系统,抖音SEO源码。
  • 原文地址:https://blog.csdn.net/Chunying27/article/details/127999484