pybind11使用

前言

為了使用C++ 編寫python的擴展程序, 需要使用pybind11, pybind11使用比較簡單,文檔也比較詳細。下面本人分別在Ubuntu和Windows系統(tǒng)上測試使用pybind11


開發(fā)/測試環(huán)境

Ubuntu系統(tǒng)

  • Ubuntu 18.04
  • pybind11
  • Anaconda3, with python 3.6
  • cmake

Windows系統(tǒng)

  • win10 64bit
  • Microsoft Visual Studio 2017
  • Anaconda3, with python 3.7

pybind11

https://github.com/pybind/pybind11

image.png
image.png
image.png
image.png

安裝配置

下載pybind11
git clone https://github.com/pybind/pybind11.git

安裝pytest
pip install pytest

編譯安裝

mkdir build
cd build
cmake ..
cmake --build . --config Release --target check

image.png
image.png

編譯好的動態(tài)庫

image.png

編譯pybind11文檔
在doc目錄下
make html

image.png

Ctrl + H 顯示隱藏文件

image.png

image.png
image.png

Windows系統(tǒng)

Requires

  • Microsoft Visaul Studio 2017 x64
  • Anaconda3 , with python 3.7

Pybind11配置安裝

首先直接下載pybind11
https://github.com/pybind/pybind11

image.png

pybind11是 header-only的,因此不需要編譯動態(tài)鏈接庫铸豁,直接使用即可。


使用VS2017測試

使用C++編寫python擴展(python調(diào)用C++)

新建一個vs c++工程

image.png

工程配置:

  • 設(shè)置編譯輸出類型
  • 添加include包含
  • 添加lib路徑
  • 鏈接器添加lib

1. 編譯輸出類型

image.png

image.png

2. include包含路徑

  1. python/include
  2. pybind11/include


    image.png
image.png

3. lib路徑

image.png

4. 鏈接器配置

image.png

image.png

C++代碼
很簡單的一個代碼箫章,編寫一個python擴展模塊,模塊中包含一個函數(shù)foo() 這是一個lamda函數(shù)。


#include<pybind11/pybind11.h>

namespace py = pybind11;

PYBIND11_MODULE(example, m) {

    m.doc() = "pybind11 example module";

    // Add bindings here
    m.def("foo", []() {
        return "Hello, World!";
    });

}

編譯生成pyd, lib
(改名為example)

image.png

測試pyd擴展
首先,打開至x64/Release目錄豺旬, 打開power shell窗口:

image.png

然后,輸入python打開python解釋器:

image.png

輸入python代碼:

import example
print(example.foo())
image.png

繼續(xù)寫一個復(fù)雜的例子

計算加柒凉,減,乘篓跛,除

#include<pybind11/pybind11.h>

namespace py = pybind11;


PYBIND11_MODULE(example, m) {

    m.doc() = "pybind11 example module";

    // Add bindings here
    m.def("foo", []() {
        return "Hello, World!";
    });

    m.def("foo2", []() {
        return "This is foo2!\n";
    });

    m.def("add", [](int a, int b) {
        return a + b;
    });

    m.def("sub", [](int a, int b) {
        return a - b;
    });

    m.def("mul", [](int a, int b) {
        return a * b;
    });

    m.def("div", [](int a, int b) {
        return static_cast<float>(a) / b;
    });

}

image.png

示例2:

image.png

代碼

#include<iostream>
#include<pybind11/pybind11.h>

namespace py = pybind11;


/*
file:///D:/pybind11-master/docs/.build/html/basics.html
*/

# if 1

int add(int a, int b) {
    return a + b;
}

int add2(int a, int b) {
    return a + b;
}

int add3(int a, int b) {
    return a + b;
}


PYBIND11_MODULE(demo2, m) {
    
    m.doc() = "example module";
    //函數(shù)名稱膝捞, 函數(shù)指針, 描述
    m.def("add", &add, "A function which adds two numbers");
    
    // keyword arguments
    //py::arg("a")
    m.def("add2", &add2, "A function which adds two numbers", py::arg("a"), py::arg("b"));

    //default arguments
    m.def("add3", &add3, "A function which adds two numbers", py::arg("a") = 10, py::arg("b") = 5);

    //Exporting variables
    m.attr("num1") = 100;
    py::object world = py::cast("World");
    m.attr("what") = world;

}

#endif

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愧沟,一起剝皮案震驚了整個濱河市蔬咬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沐寺,老刑警劉巖林艘,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異混坞,居然都是意外死亡狐援,警方通過查閱死者的電腦和手機钢坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥酱,“玉大人爹凹,你說我怎么就攤上這事∠庖螅” “怎么了禾酱?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绘趋。 經(jīng)常有香客問我颤陶,道長,這世上最難降的妖魔是什么陷遮? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任滓走,我火速辦了婚禮,結(jié)果婚禮上拷呆,老公的妹妹穿的比我還像新娘闲坎。我一直安慰自己,他們只是感情好茬斧,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布腰懂。 她就那樣靜靜地躺著,像睡著了一般项秉。 火紅的嫁衣襯著肌膚如雪绣溜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天娄蔼,我揣著相機與錄音怖喻,去河邊找鬼。 笑死岁诉,一個胖子當著我的面吹牛锚沸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涕癣,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼哗蜈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坠韩?” 一聲冷哼從身側(cè)響起距潘,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只搁,沒想到半個月后音比,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡氢惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年洞翩,在試婚紗的時候發(fā)現(xiàn)自己被綠了稽犁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡菱农,死狀恐怖缭付,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情循未,我是刑警寧澤陷猫,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站的妖,受9級特大地震影響绣檬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫂粟,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一娇未、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧星虹,春花似錦零抬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卸亮,卻和暖如春忽妒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兼贸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工段直, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溶诞。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓鸯檬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親螺垢。 傳聞我的和親對象是個殘疾皇子京闰,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 2,963評論 1 3
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007閱讀 2,202評論 0 3
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • ╭(╯^╰)╮ (*@ο@*) (⊙o⊙) (●′ω`●) 婚禮和葬禮 看起來甩苛,都是那么相像 酒杯 魚肉 嗩吶 喇...
    閑二小姐閱讀 442評論 2 2
  • 雖然每每路過, 都是驚鴻一瞥俏站。 但這一片葵海讯蒲, 是屬于陽光的顏色。 這就是陽光的顏色肄扎, 撒一片陽光墨林, 鐘情于其色赁酝。...
    釋然andy閱讀 205評論 0 1