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