Python编译Pybind11


原文地址:https://segmentfault.com/a/1190000021813795

 

Window下使用pybind11

追忆发布于 2020-02-22

pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给Python,反之亦然。主要用于将已经存在的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。利用编译时的内省来推断类型信息。

boost.python最大问题在于,boost太过复杂和庞大。而pybind11除去注释,代码仅仅4000多行,需要依赖Python2.7或Python3。本文简要地介绍了如何利用pybind11和C++实现对python功能的拓展。

一.开发环境

  1. Pycharm;
  2. Anaconda;
  3. Visual C++ Bulid Tools 2015;
  4. pybind11.

其中1、2、3直接在官网下载,pybind在Github下载(Github地址),下载解压后无需编译。

二.开发流程

流程图.PNG

不同操作系统下直接调用生成的pyd可能会出错,不能跨平台调用

pyd动态链接库的生成是在本地PC上,但是如果想在不同的操作系统、硬件平台上调用之前生成的pyd,显然是会出错的。比如在windows上编译生成了一个python扩展.pyd, 但是Ubuntu系统或者树莓派上想调用这个python扩展显然就不行了。
为了使得C/C++创建的python扩展可以跨平台使用,那么最简单的办法就是直接发布源码, 然后在该操作系统、硬件平台上编译生成python扩展。本文示例利用python setuptools编译生成动态库,开发流程大致分为以下几步:

  • 编写C++实现的功能模块;
//文件名:functions.h
#include <iostream> using namespace std; char const * greet() { return "Welcome to pybind11 !"; } class Functions { public: Functions(); double add(double, double); }; Functions::Functions(void) { cout << "object created !" << endl; } double Functions::add(double in1, double in2) { return in1 + in2; }
  • 编写将C++功能模块封装为pyd的包装函数;
//文件名:functions_wrapper.cpp
#include <pybind11/pybind11.h> #include "functions.h" namespace py = pybind11; PYBIND11_MODULE(functions, m){ m.doc() = "Simple Class"; m.def("greet", greet, "Welcome");  py::class_<Functions>(m, "Functions") .def(py::init()) .def("add", &Functions::add); }
  • 编写setup.py文件,通过setup脚本调用C++编译器编译生成python模块。在命令行执行python setup.py build_ext --inplace即可生成pyd文件;
#文件名:setup.py
from setuptools import setup, Extension functions_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])
  • 编写测试代码。
#文件名:test.py
import functions  
  
print(functions.greet()) f = functions.Functions() print(f.add(1.0, 2.0))

output:
Welcome to pybind11 !
object created !
3.0


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM