官方简介

pybind11 is a lightweight header-only library that exposes C++ types in Python and vice versa, mainly to create Python bindings of existing C++ code. Its goals and syntax are similar to the excellent Boost.Python library by David Abrahams: to minimize boilerplate code in traditional extension modules by inferring type information using compile-time introspection.

google translate---->

pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给Python,反之亦然。主要用于将已经存在的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。通过使用编译时内省推断类型信息,最大限度地减少传统扩展模块中的样板代码。

C++代码api.cpp

#include <pybind11/pybind11.h> // 导入 pybind11 的 C++ 库
#include <iostream> namespace py = pybind11; int add(int i, int j) {
return i + j;
} class Pet
{
public:
std::string name;
int age;
Pet() {}
Pet(const std::string name_, const int age_){
name = name_;
age = age_;
}
~Pet(){
std::cout << "destructed" << std::endl;
}
void setName(std::string name_)
{
name = name_;
}
const std::string getName()
{
return name;
} }; PYBIND11_MODULE(api, m) { // 创建一个 Python 模块,名为 api ,用变量 m 表示
py::class_<Pet>(m, "Pet") // 用 class_ 可以绑定一个 C++ 的 class 或 struct
.def(py::init<const std::string, const int>(), py::arg("name") = "tom", py::arg("age") = 2) // 带有默认值的、关键字参数 构造函数初始化
.def_readwrite("name", &Pet::name) // 绑定类变量
.def_readonly("age", &Pet::age) // 绑定类变量并限制为只读(修改时会抛出 AttributeError 异常)
.def("setName", &Pet::setName) // 绑定类方法
.def("getName", &Pet::getName);
m.doc() = "pybind11 example plugin"; // 可选的模块说明
m.def("add", &add, "a function which adds two numbers", // 绑定函数
py::arg("i") = 2,
py::arg("j") = 3);
}

编译so文件

g++ api.cpp -o api.so -O3 -Wall -std=c++11 -shared -fPIC `python3 -m pybind11 --includes`

python调用

进入python终端后

Python 3.7.0 (default, Jun 28 2018, 13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import api
>>> api.add(i = 4,j = 5)
9
>>> p = api.Pet(age = 2233)
>>> p.name
'tom'
>>> p.age
2233
>>>

参考链接

pybind11官方文档

demo参考

python/c++ 混合编程的更多相关文章

  1. 批处理与python代码混合编程的实现方法

    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值, 比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写, bathome出品的命令工具包管理器bc ...

  2. python c++ 混合编程中python调用c++string返回类型的函数,python中返回为数字的解决办法

    本随笔解决 Python使用ctypes 调用c++dll 字符串返回类型函数,在python中显示为数字:原文解决方案见so: https://stackoverflow.com/questions ...

  3. Python和C++的混合编程(使用Boost编写Python的扩展包)

    想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...

  4. 使用 ctypes 进行 Python 和 C 的混合编程

    Python 和 C 的混合编程工具有很多,这里介绍 Python 标准库自带的 ctypes 模块的使用方法. 初识 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库 ...

  5. 在Qt(C++)中与Python混合编程

    一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...

  6. Python黑帽编程2.2 数值类型

    Python黑帽编程2.2  数值类型 数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型.长整型.布尔.双精度浮点.十进制浮点和复数,这些类型在很多方面与传统的C类型有很大的区 ...

  7. 【转载】ANSYS的APDL与C语言混合编程(实例)

    原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...

  8. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

  9. 可爱的 Python : Python中函数式编程,第一部分

    英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...

  10. 简单上手nodejs调用c++(c++和js的混合编程)

    因为项目的原因,最近经常使用node.js搭RESTful接口. 性能还是很不错啦,感觉比Spring Boot之类的要快.而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体 ...

随机推荐

  1. MySQL-Canal-Kafka数据复制详解

    摘要 MySQL被广泛用于海量业务的存储数据库,在大数据时代,我们亟需对其中的海量数据进行分析,但在MySQL之上进行大数据分析显然是不现实的,这会影响业务系统的运行稳定.如果我们要实时地分析这些数据 ...

  2. Prompt 生产及提示词案例(含完整提示词)

    场景一:格式文本提取提示词 # 角色 Role - 你是一个高度精确的文本提取代理. # 背景 Background - 你将接收到两段不同的文本: 1. 一份**按序号排列的列表**,详细说明了需要 ...

  3. PicGo使用简明教程及踩坑记录

    PicGo使用简明教程及踩坑记录 PicGo使用 我现在用的博客的记录方式是Typora+PicGo+阿里云oss,这一套配置好后就非常方便了,可以快捷上传图片到云服务器,并且阿里云的速度也是我试过的 ...

  4. idea里面怎么把自己项目添加maven

    首先你要清楚什么是maven: maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件.Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具 ...

  5. C# 与低代码平台的融合:以活字格为例的 Web API 开发实践

    引言 在当今软件开发领域,低代码平台凭借其高效.便捷的特性逐渐成为开发的主流趋势.而 C# 作为一种功能强大的编程语言,在服务端开发中有着广泛的应用.将 C# 与低代码平台相结合,能够充分发挥两者的优 ...

  6. Mysql建表注意点

    库名.表名.字段名必须使用小写字母,"_"分割.

  7. MySQL 字符集、排序规则与查询关系详解

    MySQL 查询是否区分大小写及重音敏感,取决于创建时指定的字符集(character set)和排序规则(collation). (1)字符集(Character Set):规定可存储的字符,如 u ...

  8. 盘古信息领航PCB产业变革:以PCB行业解决方案筑基数字化工厂

    一.PCB 产业的数字化突围之战 在 5G 通信.人工智能与高端制造深度融合的当下,PCB 作为 "电子信息产业之基" 正面临双重变革压力:一方面,高端电子设备对高精密电路板的需求 ...

  9. Rust修仙之道 第三章:所有权境 · 断念诀

    第三章:所有权境 · 断念诀 "天下术士皆惧'所有权审判',唯入此境者,能断执念.知归属.通幽微." 顾行云在"灵气变通殿"闭关九日后,终于触碰到这门 Rust ...

  10. RS485串口服务器

    RS485串口服务器ZLAN5143I的一款专门为抗雷击.抗电磁干扰.抵抗恶劣环境要求而设计的一款高可靠性.高性能串口服务器/Modbus网关产品,是串口服务器的旗舰级产品.可以应用于隧道监控.风力发 ...