您好,登錄后才能下訂單哦!
小編給大家分享一下Python如何調(diào)用C++通過(guò)Pybind11制作Python接口,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
我是在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.jb51.net/article/148903.htm
首先,我們從 pybind11 github網(wǎng)址:https://github.com/pybind/pybind11 上下載源碼。
cmake工程之前,要先安裝pytest pip install pytest,否則會(huì)出錯(cuò)
用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)。
看完了這篇文章,相信你對(duì)“Python如何調(diào)用C++通過(guò)Pybind11制作Python接口”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。