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

Python調(diào)用C++,通過(guò)Pybind11制作Python接口

 更新時(shí)間:2018年10月16日 08:57:10   作者:數(shù)據(jù)架構(gòu)師  
今天小編就為大家分享一篇關(guān)于Python調(diào)用C++,通過(guò)Pybind11制作Python接口,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

我是在ubuntu系統(tǒng)進(jìn)行實(shí)驗(yàn)的,所以和window可能會(huì)有區(qū)別。

python調(diào)用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,這些方法有繁有簡(jiǎn),而pybind11的優(yōu)點(diǎn)是對(duì)C++ 11支持很好,API比較簡(jiǎn)單,現(xiàn)在我們就簡(jiǎn)單記下Pybind11的入門(mén)操作。

1. pybind11簡(jiǎn)介與環(huán)境安裝

pybind11是一個(gè)輕量級(jí)的只包含頭文件的庫(kù),它主要是用來(lái)在已有的 C++代碼的基礎(chǔ)上做擴(kuò)展,它的語(yǔ)法和目標(biāo)非常像Boost.Python,但Boost.Python為了兼容現(xiàn)有的基本所有的C++編譯器而變得非常復(fù)雜和龐大,而因此付出的代價(jià)是很多晦澀的模板技巧以及很多不必要的對(duì)舊版編譯器的支持。Pybind11摒棄了這些支持,它只支持python2.7以上以及C++ 11以上的編譯器,使得它比Boost.Python更加簡(jiǎn)潔高效。

為了使用pybind11,我們需要支持C++ 11標(biāo)準(zhǔn)的編譯器(GCC 4.8以上,VS 2015 Update 3以上)以及python 2.7以上的版本,還需要下載CMake,有了這些以后,

cmake教程可以參考://www.dbjr.com.cn/article/148903.htm

  1. 首先,我們從 pybind11 github網(wǎng)址:https://github.com/pybind/pybind11 上下載源碼。
  2. cmake工程之前,要先安裝pytest pip install pytest,否則會(huì)出錯(cuò)
  3. 用CMake編譯并運(yùn)行測(cè)試用例:
進(jìn)入pybind11的目錄,
cd tests
cmake ..
cmake --build . --config Release --target check

如果所有測(cè)試用例都通過(guò)了,說(shuō)明安裝成功了。

2. python調(diào)用C++

下載編譯好pybind11之后,我們就可以開(kāi)始對(duì)著官方的pybind11 Tutorial進(jìn)行學(xué)習(xí)了,詳細(xì)的入門(mén)教程及語(yǔ)法請(qǐng)參考官方文檔,這里,我們簡(jiǎn)單演示下如何編寫(xiě)供python調(diào)用的C++模塊.
首先,我們編寫(xiě)一個(gè)C++源文件,命名為example.cpp

#include <pybind11/pybind11.h>
namespace py = pybind11;
int add(int i, int j)
{
 return i + j;
}
PYBIND11_MODULE(example, m)
{
 // optional module docstring
 m.doc() = "pybind11 example plugin";
 // expose add function, and add keyword arguments and default arguments
 m.def("add", &add, "A function which adds two numbers", py::arg("i")=1, py::arg("j")=2);
 // exporting variables
 m.attr("the_answer") = 42;
 py::object world = py::cast("World");
 m.attr("what") = world;
}

2.1 使用window編譯

我沒(méi)有實(shí)驗(yàn),所以可以參考別的教程

2.2 CMake的編譯方法

當(dāng)然,我們也可以使用CMake進(jìn)行編譯。首先寫(xiě)一個(gè)CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(example) 
add_subdirectory(pybind11)
pybind11_add_module(example example.cpp)

這里要求example.cpp放在和pybind11同一級(jí)的目錄下,因?yàn)槲覀冊(cè)贑MakeLists.txt中調(diào)用了同目錄pybind11和同目錄的example.cpp文件。在當(dāng)前目錄下執(zhí)行

cmake .
make

會(huì)生成example.cpython-36m-x86_64-linux-gnu.so文件。這個(gè)文件就是python可以調(diào)用的文件。還是在相同目錄下運(yùn)行python,進(jìn)入python命令行

import example
example.add(3, 4)
[out]: 7

3、中級(jí)調(diào)用

上面是一個(gè)簡(jiǎn)單的例子,有時(shí)我們需要的功能可能很復(fù)雜。

生成模型設(shè)計(jì)庫(kù)調(diào)用問(wèn)題。

比如你的cpp文件中引用了其他的第三方庫(kù),這個(gè)時(shí)候我們生成的so文件,可能是需要依賴(lài)第三方庫(kù)的。

本地myopencv.cpp文件

#include <pybind11/pybind11.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <string>
namespace py = pybind11;
void read_img(std::string img_path)
{
 cv::Mat image = cv::imread(img_path, CV_LOAD_IMAGE_COLOR);
}
PYBIND11_MODULE(myopencv, m)
{
 m.def("read_img", &read_img, "get image size");
}

CMakeLists.txt可以寫(xiě)成下面這樣

cmake_minimum_required(VERSION 2.8.12)
project(myopencv)
add_subdirectory(pybind11)
pybind11_add_module(myopencv myopencv.cpp)

通過(guò)cmkae編譯通過(guò)

cmake .
make

產(chǎn)生myopencv.cpython-36m-x86_64-linux-gnu.so文件
在python中調(diào)用

import myopencv

目前這里發(fā)現(xiàn)有問(wèn)題,還沒(méi)有調(diào)通

數(shù)據(jù)類(lèi)型不匹配的問(wèn)題

比如opencv在python中是numpy的類(lèi)型,但是在c++中cv.Mat的類(lèi)型

對(duì)于opencv的類(lèi)型不匹配問(wèn)題,github上已經(jīng)給出了解決方法,

cpp和h文件下載地址 https://github.com/edmBernard/pybind11_opencv_numpy

如何你需要什么可以去github上搜索,或者自己去實(shí)現(xiàn)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • Python利用atexit模塊實(shí)現(xiàn)優(yōu)雅處理程序退出

    Python利用atexit模塊實(shí)現(xiàn)優(yōu)雅處理程序退出

    Python的atexit模塊提供了一種方便的方式來(lái)注冊(cè)這些退出時(shí)執(zhí)行的函數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • python中引用與復(fù)制用法實(shí)例分析

    python中引用與復(fù)制用法實(shí)例分析

    這篇文章主要介紹了python中引用與復(fù)制用法,以實(shí)例形式詳細(xì)分析了python中引用與復(fù)制的功能與相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • 基于Python創(chuàng)建可定制的HTTP服務(wù)器

    基于Python創(chuàng)建可定制的HTTP服務(wù)器

    這篇文章主要為大家演示一下如何使用?http.server?模塊來(lái)實(shí)現(xiàn)一個(gè)能夠發(fā)布網(wǎng)頁(yè)的應(yīng)用服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-05-05
  • Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解

    Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解

    這篇文章主要介紹了Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 深入理解Python?@dataclass的內(nèi)部原理

    深入理解Python?@dataclass的內(nèi)部原理

    文章介紹了Python中dataclass的實(shí)現(xiàn)原理,通過(guò)自定義裝飾器實(shí)現(xiàn)了__init__和__repr__方法,并解釋了__annotations__屬性和exec函數(shù)在其中的作用,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • python 使用fileinput讀取文件

    python 使用fileinput讀取文件

    這篇文章主要介紹了python 使用fileinput讀取文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python?IO多路復(fù)用之epoll詳解

    python?IO多路復(fù)用之epoll詳解

    這篇文章主要為大家詳細(xì)介紹了python?IO多路復(fù)用之epoll,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Jupyter 無(wú)法下載文件夾如何實(shí)現(xiàn)曲線(xiàn)救國(guó)

    Jupyter 無(wú)法下載文件夾如何實(shí)現(xiàn)曲線(xiàn)救國(guó)

    這篇文章主要介紹了Jupyter 無(wú)法下載文件夾如何實(shí)現(xiàn)曲線(xiàn)救國(guó)?今天小編就為大家?guī)?lái)了解決方法,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • pip install 使用國(guó)內(nèi)鏡像的方法示例

    pip install 使用國(guó)內(nèi)鏡像的方法示例

    這篇文章主要介紹了pip install 使用國(guó)內(nèi)鏡像的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問(wèn)題

    Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問(wèn)題

    這篇文章主要介紹了Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論