pybind11的Hello World

news2024/11/18 21:34:00

pybind11的Hello World

pybind11 是用来将c++的函数\类等封装为python模块的。从而在python中就可以调用C++的库。

安装

pybind11是个C++的header-only的库。因此无需安装,只需要有头文件即可。

自己新建一个C++文件夹。在文件夹内将pybind作为一个外部库,使用cmake来管理。

首先git clone

git clone https://github.com/pybind/pybind11 --depth=1

然后删掉.git文件

CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(tryPybind)

add_subdirectory(pybind11)
pybind11_add_module(tryPybind tryPybind.cpp)

add_custom_command(
        TARGET ${PROJECT_NAME}  POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_BINARY_DIR}/$<CONFIGURATION> ${CMAKE_CURRENT_LIST_DIR}
        )

注意pybind11_add_module这个cmake函数。它的用法如下

pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
                    [NO_EXTRAS] [THIN_LTO] [OPT_SIZE] source1 [source2 ...])

最基本的用法是,第一个是模块名,第二个是源文件

cmake中最后这个add_custom_command的意思是把输出的build/Release下面的所有文件拷到最外层,方便后面我们测试的时候导入模块。

绑定一个c++的函数

#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;

//绑定一个函数
int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(tryPybind, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function that adds two numbers");
}

这段的意思就是:

  • 利用PYBIND11_MODULE这个宏,它接受两个参数。第一个tryPybind是模块名,第二个参数不用管,就m就行。
  • m.def就是定义一个python中的函数,函数名为add,函数绑定到c++的add函数

运行cmake

会产生三个文件
在这里插入图片描述
其中tryPybind.xxx.pyd是python的动态库

.exp是windows下面的导出库文件,它包含了导出函数和数据项的信息

.lib是windows下面的c++静态库

然后定义一个python脚本

pyTry.py

import tryPybind

a = tryPybind.add(1, 2)
print(a)

打印结果

3

绑定一个c++的类

把c++的源码改为

tryPybind.cpp

#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;

//绑定一个类
class SomeClass
{
    float scale;
public:
    SomeClass(float scale_) : scale(scale_) { };
    float multiply(float input) {
        float res =  scale * input;
        std::cout<<"res:"<<res<<std::endl;
        return res;
    }
};

PYBIND11_MODULE(tryPybind,m)
{
    py::class_<SomeClass>(m, "SomeClass")
        .def("multiply", &SomeClass::multiply)
        .def(py::init<float>());
}

python脚本改为

pyTry.py

import tryPybind

print(dir(tryPybind))
a = tryPybind.SomeClass(2.1)
a.multiply(2.0)

输出结果

['SomeClass', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
res:4.2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第七次更新,Spring Cloud Alibaba,迎接微服务生态的下一个十年

Spring Cloud Alibaba是什么&#xff1f; 2022年都快过完了&#xff0c;我相信大家肯定不用我说Spring Cloud Alibaba是什么了&#xff01; 近期阿里最新开源了一份&#xff0c;Spring Cloud Alibaba&#xff08;全解第7版&#xff09;&#xff0c;我大概看了一下&#xff0c…

JAMA Neurology:帕金森病跨疾病阶段的新兴神经成像生物标记物

意义&#xff1a;帕金森病(PD)的成像生物标记物在临床试验中的发病进程监测方面起到越来越重要&#xff0c;也具有改善临床护理和管理的潜力。这篇综述阐述了临床医生和研究人员需要明确在临床过程中使用的PD诊断和发病进程的成像生物标记物的时间相关性。磁共振成像(扩散成像、…

目标检测算法——人体姿态估计数据集汇总(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批人体姿态估计数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 一、KTH 多视图足球数据集 数据集链接&#xff1a…

python快速实现NPV净现值计算

净现值指未来资金&#xff08;现金&#xff09;流入&#xff08;收入&#xff09;现值与未来资金&#xff08;现金&#xff09;流出&#xff08;支出&#xff09;现值的差额&#xff0c;是项目评估中净现值法的基本指标。未来的资金流入与资金流出均按预计折现率各个时期的现值…

2023年天津仁爱学院专升本报名确认缴费考试流程

2023年天津仁爱学院专升本报名确认缴费操作流程说明及考试时间一、报名操作流程 1. 报名注册 请考生于2022年12月7日上午9点—12月11日中午12&#xff1a;00点登录报名系统https://jw.tjrac.edu.cn/zsb&#xff0c;点击“注册”按钮后进入报名登录界面&#xff0c;先请仔细阅读…

多线程学习笔记(三)

一、缓存行 缓存行&#xff1a;从缓存中读取数据是按照一块来读取的&#xff0c;这一块叫做缓存行&#xff0c;64字节大小缓存一致性协议&#xff1a;当两个数位于同一个缓存行时&#xff0c;有两个线程需要同时读取了缓存行中的数据后进行修改&#xff0c;需要和另一个线程的…

如何使用CCES来生成双核DSP的可烧写文件以及Flash Program

作者的话 之前的文章里有写到如何使用CCES来进行DSP的flash program&#xff0c;那都是单核的DSP&#xff0c;而ADI还有很多双核甚至三核DSP&#xff0c;这些DSP应该如何操作呢&#xff0c;会有哪些不同&#xff1f;我再写一个文档来说一下。 跟单核DSP一样&#xff0c;在 CC…

【测绘程序设计】——角度与弧度的转换(C#,C++,Python)

本文分享了 测绘程序设计——角度与弧度的转换(含C#、C++和Python版),相关源代码(完整工程,直接运行)及使用示例如下。 目录 Part.Ⅰ 使用示例Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅱ 代码分析Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅲ 源码下载Part…

实战YOLO V5推演(TensorRT版本 C++)

提示&#xff1a;兜兜转转还是来到了C&#xff0c;欠的债该还的得还&#xff0c;因此本篇文章试图从C来撬动tensorrt 完成转换模型和推理&#xff0c;而不是借助python库 文章目录前言一、Tensorrt前置1.1 Tensorrt基本概念1.2 异步推演说明二、实战YOLO V5推演1.TensorRT模型转…

大学电子系C++模拟考试

随手附上一些代码&#xff0c;未必是最优解&#xff0c;仅供参考。 加密四位数 【问题描述】 输入一个四位数&#xff0c;将其加密后输出。方法是将该数每一位的数字加9&#xff0c;然后除以10取余作为该位上的新数字&#xff0c;最后将千位上的数字和十位上的数字互换&#…

Prometheus 监控mysql

目录 下载安装mysqld_exporter 在mysql中创建监控用户并赋权 启动mysqld_exporter 添加到系统服务 浏览器访问服务器9104端口 在prometheus定义job来监控mysqld 运行prometheus并在端口9090上进行访问查看节点信息 根据具体需求再在可视化平台上定义数据源来进行可视化…

Java数据结构之树与二叉树

2.3 二叉树的性质&#xff08;重点&#xff0c;选择题常考&#xff09; 2.4 二叉树的链式存储 2.5 二叉树的基本操作 2.5.1 前提说明 2.5.2 二叉树的遍历 2.5.3 二叉树基本操作的实现&#xff08;重点&#xff09; 1. 树形结构 1.1 树的概念 树是一种非线性的数据结构&…

[附源码]JAVA毕业设计体检系统(系统+LW)

[附源码]JAVA毕业设计体检系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

JavaScript实现一段时间之后关闭广告

JavaScript实现一段时间之后关闭广告 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获…

水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 水下机器人-机械手系统&#xff08;Underwater vehicle-manipulator systems, UVMS&#xff09;可以完成除观测之外的水下采样…

[论文解析] HeadNeRF: A Realtime NeRF-based Parametric Head Model

code link: https://github.com/CrisHY1995/headnerf 相关连接&#xff1a; https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/124874717 来自中科大张举勇教授课题组提出了 HeadNeRF&#xff0c;一种基于 NeRF 的高效全息人脸头部参数化模型&#xff0c;该工作发表…

阿里面试Redis最常问的三个问题:缓存穿透、缓存击穿、缓存雪崩(带答案)

一、缓存穿透 如上图&#xff0c;正常情况下&#xff0c;如果用户在redis缓存中没有查询到自己想要的数据&#xff0c;就会去mysql数据库中查询。如果mysql数据库中也没有&#xff0c;在没有任何措施下&#xff0c;用户一定会不断的去mysql数据库中查询&#xff0c;随着时间的推…

风控串行组合模型及其信用评估场景实践

在信贷风控中&#xff0c;数据建模好像是“家常便饭”那么普通且重要&#xff0c;而我们最终享用“饭菜”的美味程度&#xff0c;在数据“食材”较完备的情况下&#xff0c;完全取决于我们建模的方法。根据实际业务场景&#xff0c;采用合理且有效的建模思路&#xff0c;可以较…

诊断和响应故障_RMAN数据修复概念

1&#xff0e;RMAN数据修复概述 1.1&#xff0e;关于需要数据修复的问题 虽然有几种问题会中止Oracle数据库的正常操作或影响数据库I/O操作&#xff0c;只有以下几种情况要求DBA介入和数据修复&#xff1a;用户错误&#xff0c;应用程序错误和介质故障。 1.1.1&#xff0e;关…

[附源码]计算机毕业设计JAVA中达小区物业管理系统

[附源码]计算机毕业设计JAVA中达小区物业管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…