用pybind11封装C++实现的函数库的方法示例

现有若干用C++编写的函数,为了能够用Python调用它们,可以通过pybind11将它们封装到一个Python模块中,在编写Python程序时只要导入该模块便能使用这些函数。

一.实现步骤

  • 用C++函数实现函数功能;
  • 编写头文件,将函数的声明包含在头文件中;
  • 编写pybind11封装函数;
  • 用Python编写setup脚本;
  • 生成动态链接库pyd文件;
  • 测试函数功能。

二.代码实现

1.用C++函数实现函数功能

//文件名:add.cpp
extern "C" double add(double in1, double in2)
{
 return in1 + in2;
}
//文件名:sub.cpp
extern "C" double sub(double in1, double in2)
{
 return in1 - in2;
}
//文件名:mul.cpp
extern "C" double mul(double in1, double in2)
{
 return in1 * in2;
}
//文件名:div.cpp
extern "C" double div1(double in1, double in2)
{
 return in1 / in2;
}

2.编写头文件,将函数的声明包含在头文件中

//文件名:functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H 

#include <iostream> 

using namespace std; 

extern "C" double add(double, double);
extern "C" double sub(double, double);
extern "C" double mul(double, double);
extern "C" double div1(double, double); 

#endif

3.编写pybind11封装函数

//文件名:functions_wrapper.cpp
#include <pybind11/pybind11.h>
#include "functions.h" 

namespace py = pybind11; 

PYBIND11_MODULE(functions, m){
 m.doc() = "Simple Class";
 m.def("add", &add);
 m.def("sub", &sub);
 m.def("mul", &mul);
 m.def("div", &div1);
}

4.用Python编写setup脚本

#文件名:setup.py
from setuptools import setup, Extension 

functions_module = Extension(
 name = 'functions',
 sources = ['add.cpp', 'sub.cpp', 'mul.cpp', 'div.cpp', 'functions_wrapper.cpp'],
 include_dirs = [r'D:\software\pybind11-master\include',
     r'D:\software\Anaconda\include']
) 

setup(ext_modules = [functions_module])

5.生成动态链接库pyd文件

在命令行执行 python setup.py build_ext --inplace ,在当前路径下生成pyd动态库。

6.测试函数功能

#文件名:test.py
import functions 

print(functions.add(0.9, 3))
print(functions.sub(0.9, 3))
print(functions.mul(0.9, 3))
print(functions.div(0.9, 3))

output:
3.9
-2.1
2.7
0.3

到此这篇关于用pybind11封装C++实现的函数库的方法实现的文章就介绍到这了,更多相关pybind11封装C++实现函数库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python调用C++,通过Pybind11制作Python接口

    我是在ubuntu系统进行实验的,所以和window可能会有区别. python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作. 1. pybind11简介与环境安装 pybind11是一个轻量级的只包含头文件的库,它主要是用来在已有的 C++代码的基础上做扩展,它的语法和目标非常像Boost.Python,但

  • 用pybind11封装C++实现的函数库的方法示例

    现有若干用C++编写的函数,为了能够用Python调用它们,可以通过pybind11将它们封装到一个Python模块中,在编写Python程序时只要导入该模块便能使用这些函数. 一.实现步骤 用C++函数实现函数功能: 编写头文件,将函数的声明包含在头文件中: 编写pybind11封装函数: 用Python编写setup脚本: 生成动态链接库pyd文件: 测试函数功能. 二.代码实现 1.用C++函数实现函数功能 //文件名:add.cpp extern "C" double add(

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • thinkPHP模板中函数的使用方法示例

    本文实例讲述了thinkPHP模板中函数的使用方法.分享给大家供大家参考,具体如下: 1.php中的方法使用 <?php $var_num = "13966778888"; $str = substr_replace($var_num,'*****',3,5); echo $str; $var_date = time(); $str = date("Y-m-d H:i",$var_date); echo $str; ?> 2.模板中的使用 {sh:$me

  • PHP实现动态获取函数参数的方法示例

    本文实例讲述了PHP实现动态获取函数参数的方法.分享给大家供大家参考,具体如下: PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 func_get_args()  函数即可. 可变参数并不需要特别的语法,参数列表仍按函数定义的方式传递给函数,并按通常的方式使用这些参数. 1. func_num_args - 返回传入函数的参数总个数 int func_num_args ( void ) 示例 <?ph

  • Python pandas自定义函数的使用方法示例

    本文实例讲述了Python pandas自定义函数的使用方法.分享给大家供大家参考,具体如下: 自定义函数的使用 import numpy as np import pandas as pd # todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上 ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde')) df1 = pd.DataFrame(np.random.randint(-10,10,(

  • python中@property和property函数常见使用方法示例

    本文实例讲述了python中@property和property函数常见使用方法.分享给大家供大家参考,具体如下: 1.基本的@property使用,可以把函数当做属性用 class Person(object): @property def get_name(self): print('我叫xxx') def main(): person = Person() person.get_name if __name__ == '__main__': main() 运行结果: 我叫xxx 2.@pr

  • c++11封装thread库的方法示例

    前言 c++11在语言层面上提供了对thread的支持,由于不同的平台提供了不同线程API,在语言层面提供了对thread的支持可以大大的减小代码移植的工作量. 本文将给大家详细介绍关于c++11封装thread库的相关内容,下面话不多说了,来一起看看详细的介绍吧 基本接口要求 要求std::thread的构造函数 template< class Function, class... Args > explicit thread( Function&& f, Args&

  • python中reduce()函数的使用方法示例

    前言 本文主要给大家介绍了关于python中reduce()函数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: reduce()函数在库functools里,如果要使用它,要从这个库里导入.reduce函数与map函数有不一样地方,map操作是并行操作,reduce函数是把多个参数合并的操作,也就是从多个条件简化的结果,在计算机的算法里,大多数情况下,就是为了简单化.比如识别图像是否是一只猫,那么就是从众多的像素里提炼出来一个判断:是或否.可能是几百万个像素,就只

  • C++可变参数函数的实现方法示例

    C++编程中实现可变参数函数有多种途径,本文介绍一种最常见的实现途径,即可变参数宏方法:形参生命为省略符,函数实现时用参数列表宏访问参数. 1. 可变参数宏实现变参函数 可变参数宏实现可分为以下几个步骤: 函数形参原型中给出省略符: 函数实现中声明一个va_list可变参数列表变量: 开始初始化构造va_list变量: 访问变参列表: 完成清理工作: 上述步骤的实现需要使用到四个宏: va_list void va_start(va_list ap, last_arg) type va_arg

  • python中map()函数的使用方法示例

    前言 在python里有一个函数map(),它有点高大上的感觉.本文将详细给大家介绍python中map()函数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 或许你已经看过GOOGLE最挣钱的论文: "MapReduce: Simplified Data Processing on Large Clusters" Google的那篇MapReduce论文里说:Our abstraction is inspired by the map and redu

随机推荐