欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++/Python混合編程之小結(jié)Pybind11的使用

 更新時(shí)間:2025年05月07日 10:26:29   作者:為時(shí)不晚L  
Pybind11是一個(gè)輕量級(jí)的C++庫,用于將你的C++代碼暴露給Python調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、pybind11簡(jiǎn)單介紹

一些python和C++混編方案:

  • Python官方的Python/C API, 缺點(diǎn):所有數(shù)據(jù)類型必須手動(dòng)改為Cpython封裝的binding類型;
  • Cython,編譯器支持python代碼轉(zhuǎn)為C代碼,缺點(diǎn):移值和復(fù)用成本高
  • SIWG 主要解決高級(jí)語言與C和C++語言交互問題,支持10幾種編程語言如java、python、C#等。在python端性能表現(xiàn)不太好
  • Boost.Python  為C++中廣泛應(yīng)用的Boost開源庫,編譯和依賴關(guān)系繁重,如果只用于解決python的交互,大材小用了。
  • pyind11   理解為Boost.Python的藍(lán)本,基于C++11應(yīng)用了很多新特性,Pybind11 通過 C++ 編譯時(shí)的自省來推斷類型信息,來最大程度地減少傳統(tǒng)拓展 Python 模塊時(shí)繁雜的樣板代碼, 且實(shí)現(xiàn)了常見數(shù)據(jù)類型,如 STL 數(shù)據(jù)結(jié)構(gòu)、智能指針、類、函數(shù)重載、實(shí)例方法等到 Python 的自動(dòng)轉(zhuǎn)換,其中函數(shù)可以接收和返回自定義數(shù)據(jù)類型的值、指針或引用

簡(jiǎn)言之,Pybind11 是一個(gè)輕量級(jí)的 C++ 庫,用于將你的 C++ 代碼暴露給 Python 調(diào)用(反之也可,但主要還是前者)。Pybind11 借鑒了 Boost::Python 庫的設(shè)計(jì),但使用了更為簡(jiǎn)潔的實(shí)現(xiàn)方式,保證開發(fā)效率和實(shí)用性。其幫助文檔鏈接如下:

官方文檔:  pybind11 documentation

中文版本: 安裝庫 — pybind11 文檔

二、pybind11 環(huán)境準(zhǔn)備

1.配置環(huán)境說明

window10+  VS2017+python3.10(本電腦安裝了Anaconda是python3.10這個(gè)環(huán)境,也可以使用其它版本,window要求Visual Studio 2017 及更新版本)

2.安裝pybind11

方式1:直接下載源代碼 git clone GitHub - pybind/pybind11: Seamless operability between C++11 and Python

方式2:直接用pip命令安裝:pip install pybind11  或使用 pip3 install pybind11 (pip3同時(shí)會(huì)下載python3.0+版本)

查看python -m 默認(rèn)下載路徑:

直接指定存放目錄的下載方式:

python -m pip install pybind11 --target=D:\python\site-packages

下載的pybind11目錄如下:

三、python調(diào)用C++動(dòng)態(tài)庫測(cè)試?yán)?/h2>

底層邏輯:把C++中編寫的函數(shù),用pybind封裝為調(diào)用的pyd庫,成功在python中import調(diào)用;

說明:pybind11 是只包含頭文件的庫,因此不需要鏈接到任何特殊的庫,也沒有中間(magic)轉(zhuǎn)換步驟。win系統(tǒng)上C++編程時(shí)只要包含到include路徑就行。注意要包含對(duì)應(yīng)的python庫目錄。

1.VS屬性配置

VS2017上新建項(xiàng)目,屬性中包含pybind 和python對(duì)應(yīng)的include目錄。 我使用的是conda中python3.10所以路徑不一樣。

附加庫目錄,增加python的庫目錄:

添加python的lib庫:

在工程屬性—>常規(guī)—>目標(biāo)文件擴(kuò)展名修改為.pyd,配置類型改為.dll

2.編寫綁定文件并測(cè)試

方法:使用PYBIND11_MODULE()將所有需要封裝的代碼都放在里面。

PYBIND11_MODULE() 宏創(chuàng)建了一個(gè)函數(shù),當(dāng) Python 內(nèi)部發(fā)出 import 語句時(shí)將調(diào)用該函數(shù)。

第一個(gè)參數(shù):模塊名(testPyd)作為第一個(gè)宏參數(shù)給出(它不應(yīng)該在引號(hào)中)。

第二個(gè)參數(shù):m定義了類型的變量 py::module_ ,它是創(chuàng)建綁定的主接口。

module_::def() :會(huì)生成綁定代碼,將 add() 函數(shù)公開給 Python。

CPP文件如下:

編譯生成文件:(生成的文件要和綁定模塊名稱一致)

 其中,pyd文件是生成的動(dòng)態(tài)庫,可供給python調(diào)用。以下為python調(diào)用testPyd.pyd的add函數(shù)的測(cè)試結(jié)果:

如圖,在python中成功調(diào)用add函數(shù)。 注意運(yùn)行時(shí)一定要在有testPyd.pyd文件的目錄。

3.結(jié)構(gòu)體類型的綁定

在python中測(cè)試如下:

上面print(p)的信息沒有具體name,可以使用 __repr__函數(shù):

4.其它數(shù)據(jù)類型

可以查看幫助文檔,按照上面的方式綁定到模塊中。如果C++文件中代碼調(diào)用了第三方dll庫,在python中調(diào)用時(shí),需要把dll文件放在py文件運(yùn)行目錄中

四、python調(diào)用C++的測(cè)試?yán)?/h2>

底層邏輯:pybind11 使用C++ 封裝了 Python 類型和函數(shù),通過python解釋器可以供C++調(diào)用

1.編寫一個(gè)example.py文件:【我存放于工程目錄子文件夾python_scripts中】

2.編寫調(diào)用example模塊的C++main文件:

3.運(yùn)行測(cè)試main代碼

記得在屬性中把,輸出文件格式改為.exe。測(cè)試打印結(jié)果如下:

結(jié)果一致!

4.遺留問題

在初始化python環(huán)境時(shí),開始使用的是py::scoped_interpreter guard{};初始化方法,但這個(gè)方法報(bào)如下錯(cuò)誤,有檢測(cè)自己的環(huán)境配置都是正常,也按初始環(huán)境的打印設(shè)置了路徑,仍未解決。原因不明,暫時(shí)擱置在這里:

引發(fā)了未經(jīng)處理的異常:讀取訪問權(quán)限沖突。

this->m_ptr->**ob_type** 是 0xFFFFFFFFFFFFFFE7。

到此這篇關(guān)于C++/Python混合編程之小結(jié)Pybind11的使用的文章就介紹到這了,更多相關(guān)pybind11 c++混合編程python 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 八大排序算法的Python實(shí)現(xiàn)

    八大排序算法的Python實(shí)現(xiàn)

    這篇文章主要介紹了八大排序算法的Python實(shí)現(xiàn),對(duì)八大排序算法進(jìn)行詳細(xì)描述和代碼實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 詳解Python中Pandas read_csv參數(shù)使用

    詳解Python中Pandas read_csv參數(shù)使用

    在使用 Pandas 進(jìn)行數(shù)據(jù)分析和處理時(shí),read_csv 是一個(gè)非常常用的函數(shù),本文將詳細(xì)介紹 read_csv 函數(shù)的各個(gè)參數(shù)及其用法,希望對(duì)大家有所幫助
    2022-10-10
  • 大家都說好用的Python命令行庫click的使用

    大家都說好用的Python命令行庫click的使用

    這篇文章主要介紹了大家都說好用的Python命令行庫click的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python實(shí)現(xiàn)生成簡(jiǎn)單的Makefile文件代碼示例

    Python實(shí)現(xiàn)生成簡(jiǎn)單的Makefile文件代碼示例

    這篇文章主要介紹了Python實(shí)現(xiàn)生成簡(jiǎn)單的Makefile文件代碼示例,本文給出了兩段實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層

    Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層

    這篇文章主要介紹了Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 詳解基于python的圖像Gabor變換及特征提取

    詳解基于python的圖像Gabor變換及特征提取

    這篇文章主要介紹了基于python的圖像Gabor變換及特征提取,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • Pycharm小白級(jí)簡(jiǎn)單使用教程

    Pycharm小白級(jí)簡(jiǎn)單使用教程

    pycharm是一種Python IDE,能夠幫助我們?cè)诰帉懘a時(shí)提高效率。 這篇文章主要介紹了Pycharm小白級(jí)簡(jiǎn)單使用教程,需要的朋友可以參考下
    2020-01-01
  • Python為何不支持switch語句原理詳解

    Python為何不支持switch語句原理詳解

    這篇文章主要介紹了Python為何不支持switch語句原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python 的lru_cache裝飾器使用簡(jiǎn)介

    Python 的lru_cache裝飾器使用簡(jiǎn)介

    這篇文章主要介紹了Python 的lru_cache 裝飾器使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python中l(wèi)ogging模塊的用法實(shí)例

    Python中l(wèi)ogging模塊的用法實(shí)例

    這篇文章主要介紹了Python中l(wèi)ogging模塊的用法實(shí)例,以實(shí)例形式介紹了日志模塊logging的用法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09

最新評(píng)論