当前位置: 首页 > news >正文

学习pybind11:Hello World例子

首先要明白pybind11是干啥的,对于一个C/C++库,可以用pybind11封装它的接口为Python接口,这样得到一个python库,就可以把功能强大的库丢给使用python的boys & girls使用了~

因此,使用pybind11做封装,是我们“library developer”干的事情,说不上底层,但也比较底层了。你应该会用CMake,你也应该熟悉C/C++和Python。你编译出来的python库,其实就是一个.so结尾的动态库,也就是python里的一个module。

现在实现一个add(a, b)的接口,功能是计算两个数字的和。不考虑各种边界情况。

mkdir -p ~/work/test/toy
cd $_
mkdir 3rdparty
git clone https://github.com/pybind/pybind11 3rdparty/pybind11
mkdir build
mkdir src
touch src/example.cpp
touch CMakeLists.txt

目录结构
在这里插入图片描述

src/example.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 docstringm.def("add", &add, "A function which adds two numbers");
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.14)project(toy)set(CMAKE_CXX_STANDARD 11)add_subdirectory(3rdparty/pybind11)
pybind11_add_module(example src/example.cpp)

执行构建:

cd build
cmake ..
make

在这里插入图片描述
其中红框里的.so文件就是我们生成的python库了。在python中加载它(盘它!):

import exampleexample.add(100, 200)
example.__doc__

在这里插入图片描述

简要分析说明

这里的CMakeLists.txt中,通过加载pybind11目录,会把pybind11/tools/pybind11Tools.cmake中的pybind11_add_module()函数引入。这个函数的功能,是创建一个指定名字的库(target是一个动态库);但是,会修改库文件名字的前缀后缀;并且还有一堆其他的编译链接设定。因此这里不通过手动add_library()命令来创建target,而是先包含pybind11目录再用pybind11_add_module()函数。

也就是说,pybind11被当成一个3rdparty库被引入当前工程。从代码版本控制的角度看,可以把它弄成一个submodule,当然如果强项作为源码管理也可以,但是要注意tests子目录有3M大,可以考虑删除。

C/C++代码中的example和CMakeLists.txt中的target名字,要保持一致吗?
是的,要保持一致。譬如把C++中的example改为exampleMod则虽然能编译出库,但是Python中无法import:
在这里插入图片描述

相关文章:

  • Linux学习第二天(yum、vim工具)
  • 自定义焊件轮廓库的方法
  • FFMPEG 推流至 NGINX-RTMP 服务
  • React PureComponent 和 React.memo()区别
  • 各平台,各语言基础数据类型占用字节比较
  • 数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS
  • Centos7下安装ruby2.7.8环境、WPScan的安装及使用介绍
  • 项目登录方案选型
  • 10分钟快速开始SkyWalking结合Springboot项目
  • 在两台CentOS 7服务器(IP地址分别为192.168.8.171和192.168.8.183)上部署MinIO集群。
  • nginx高级配置详解
  • Spring6学习技术|事务
  • 二. 系统性能评价(2分)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • 七大查找算法详解并附代码实现
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular 2 DI - IoC DI - 1
  • angular学习第一篇-----环境搭建
  • create-react-app做的留言板
  • CSS 三角实现
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ECS应用管理最佳实践
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript服务器推送技术之 WebSocket
  • leetcode讲解--894. All Possible Full Binary Trees
  • React系列之 Redux 架构模式
  • sublime配置文件
  • Terraform入门 - 1. 安装Terraform
  • 成为一名优秀的Developer的书单
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • Mac 上flink的安装与启动
  • 阿里云重庆大学大数据训练营落地分享
  • ​iOS安全加固方法及实现
  • #pragma once
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)常见O(n^2)排序算法解析
  • (11)MATLAB PCA+SVM 人脸识别
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Java)【深基9.例1】选举学生会
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)appium-desktop定位元素原理
  • (一)基于IDEA的JAVA基础10
  • (译)计算距离、方位和更多经纬度之间的点
  • .aanva
  • .bashrc在哪里,alias妙用
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码