当前位置: 首页 > 后端技术 > Python

在Window下使用pybind11

时间:2023-03-26 12:13:50 Python

pybind11是一个轻量级的“Header-only”库,它向Python公开C++类型,反之亦然。主要用于将已有的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。利用编译时自省来推断类型信息。boost.python最大的问题是boost过于复杂和庞大。但是pybind11去掉注释,代码只有4000多行,需要依赖Python2.7或者Python3。本文简单介绍如何使用pybind11和C++来扩展python的功能。1、开发环境Pycharm;蟒蛇;VisualC++构建工具2015;pybind11。其中1、2、3是直接从官网下载的,pybind是从Github上下载的(Github地址)。下载解压后,无需编译。2、不同操作系统下直接调用生成的pyd的开发过程可能会出错,无法跨平台调用pyd动态链接库。动态链接库的生成是在本地PC上,但是如果要在不同的操作系统和硬件平台上调用之前生成的pyd,显然是要出错的。比如在windows上编译生成了一个python扩展.pyd,但是在ubuntu系统或者树莓派上调用这个python扩展显然是不可能的。为了让C/C++创建的python扩展能够跨平台使用,最简单的方法就是直接发布源代码,然后在操作系统和硬件平台上编译生成python扩展。本文示例使用pythonsetuptools编译生成动态库。开发过程大致分为以下几个步骤:编写C++实现的功能模块;//文件名:functions.h#includeusingnamespacestd;charconst*greet(){返回“欢迎来到pybind11!”;}类函数{公共:函数();双加(双,双);};Functions::Functions(void){cout<<“对象已创建!”<<结束;}doubleFunctions::add(doublein1,doublein2){returnin1+in2;}编写一个wrapper函数,将C++函数模块封装为pyd;//文件名:functions_wrapper.cpp#include#include"functions.h"namespacepy=pybind11;PYBIND11_MODULE(functions,m){m.doc()="简单类";m.def("打招呼",打招呼,"欢迎光临");py::class_(m,"Functions").def(py::init()).def("add",&Functions::add);}编写setup.py文件,通过setup脚本调用C++编译器编译生成python模块。在命令行执行pythonsetup.pybuild_ext--inplace生成pyd文件;#文件名:setup.pyfromsetuptoolsimportsetup,Extensionfunctions_module=Extension(name='functions',sources=['functions_wrapper.cpp'],include_dirs=[r'D:\software\pybind11-master\include',r'D:\software\Anaconda\include'])setup(ext_modules=[functions_module])编写测试代码。#Filename:test.pyimportfunctionsprint(functions.greet())f=functions.Functions()print(f.add(1.0,2.0))输出:Welcometopybind11!objectcreated!3.0