电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

pybind11: C++ 工程提供 Python 接口的實例代碼

瀏覽:3日期:2022-07-12 11:45:20

C/C++ 工程提供 Python 接口,有利于融合進 Python 的生態。現在 Python 在應用層,有其得天獨厚的優勢。尤其因為人工智能和大數據的推波助瀾, Python 現在以及未來,將長期是最流行的語言之一。

那 C/C++ 怎么提供 Python 接口呢?

ctypes: C 與 Python 綁定, Python 內建模塊 Boost.Python: C++ 與 Python 綁定, Boost 模塊 pybind11: C++11 與 Python 綁定, 減去了舊 C++ 支持,更輕量化

本文將介紹 pybind11 的環境準備與入門使用。

pybind11: https://github.com/pybind/pybind11

環境準備

pybind11 是一個 header-only 的庫,換句話說,只需要 C++ 項目里直接 include pybind11 的頭文件就能使用。

這里則介紹如何于 CMake 里引入 pybind11 。而更多編譯系統的介紹,可見官方文檔 Build systems 。

獲取 pybind11

可以 git submodule 添加子模塊,最好固定為某個版本:

git submodule add https://github.com/pybind/pybind11.git third_party/pybind11-2.5.0cd third_party/pybind11-2.5.0/git checkout tags/v2.5.0

或者,直接獲取源碼,放進相應子目錄即可。

添加進 CMake

CMakeLists.txt 里 add_subdirectory pybind11 的路徑,再用其提供的 pybind11_add_module 就能創建 pybind11 的模塊了。

cmake_minimum_required(VERSION 3.1)project(start-pybind11 VERSION 0.1.0 LANGUAGES C CXX)set(MY_PYBIND ${MY_CURR}/third_party/pybind11-2.5.0)add_subdirectory(${MY_PYBIND})pybind11_add_module(example_pb example_pb.cpp)

如果想在已有 C++ 動態庫上擴展 pybind11 綁定,那么 target_link_libraries 鏈接該動態庫就可以了。

target_link_libraries(example_pb PUBLIC example)

綁定一個函數

我們先實現一個 add 函數,

int add(int i, int j) { return i + j;}

為了簡化工程,可以直接實現在 example_pb.cpp 里,

#include <pybind11/pybind11.h>namespace py = pybind11;int add(int i, int j) { return i + j;}PYBIND11_MODULE(example_pb, m) { m.doc() = 'example_pb bindings'; m.def('add', &add, 'A function which adds two numbers');}

之后,于 CMakeLists.txt 所在目錄,執行 cmake 編譯就完成了。

示例代碼

first_steps.h first_steps.cc first_steps_pb.cc

綁定一個類

我們先實現一個定時觸發器的類。使用如下:

#include <iostream>#include 'tick.h'int main(int argc, char const *argv[]) { (void)argc; (void)argv; Tick tick(500, 5000); tick.SetTickEvent([&tick](std::int64_t elapsed_ms) { std::cout << 'elapsed: ' << elapsed_ms << ' ms' << std::endl; if (elapsed_ms >= 2000) { tick.Stop(); } }); tick.Start(); tick.WaitLifeOver(); return 0;}

運行結果:

$ ./_output/bin/cpp_thread_callback/tick_testelapsed: 0 mselapsed: 500 mselapsed: 1000 mselapsed: 1500 mselapsed: 2000 ms

該類的聲明如下:

using TickEvent = std::function<void(std::int64_t elapsed_ms)>;using TickRunCallback = std::function<void()>;class Tick { public: using clock = std::chrono::high_resolution_clock; Tick(std::int64_t tick_ms, std::int64_t life_ms = std::numeric_limits<std::int64_t>::max()); Tick(TickEvent tick_event, std::int64_t tick_ms, std::int64_t life_ms = std::numeric_limits<std::int64_t>::max(), TickRunCallback run_beg = nullptr, TickRunCallback run_end = nullptr); virtual ~Tick(); bool IsRunning() const; void Start(); void Stop(bool wait_life_over = false); const std::chrono::time_point<clock> &GetTimeStart() const; void SetTickEvent(TickEvent &&tick_event); void SetTickEvent(const TickEvent &tick_event); void SetRunBegCallback(TickRunCallback &&run_beg); void SetRunBegCallback(const TickRunCallback &run_beg); void SetRunEndCallback(TickRunCallback &&run_end); void SetRunEndCallback(const TickRunCallback &run_end); void WaitLifeOver(); protected: // ...};

然后, pybind11 綁定實現如下:

#include <pybind11/pybind11.h>#include <pybind11/chrono.h>#include <pybind11/functional.h>#include <memory>#include 'cpp/cpp_thread_callback/tick.h'namespace py = pybind11;using namespace pybind11::literals; // NOLINTPYBIND11_MODULE(tick_pb, m) { m.doc() = 'tick_pb bindings'; py::class_<Tick, std::shared_ptr<Tick>>(m, 'Tick') .def(py::init<std::int64_t, std::int64_t>()) .def(py::init<TickEvent, std::int64_t, std::int64_t, TickRunCallback, TickRunCallback>()) .def_property_readonly('is_running', &Tick::IsRunning) .def('start', &Tick::Start) .def('stop', &Tick::Stop, 'wait_life_over'_a = false) .def('get_time_start', &Tick::GetTimeStart) .def('set_tick_event', [](Tick &self, const TickEvent &tick_event) { self.SetTickEvent(tick_event); }) .def('set_run_beg_callback', [](Tick &self, const TickRunCallback &run_beg) { self.SetRunBegCallback(run_beg); }) .def('set_run_end_callback', [](Tick &self, const TickRunCallback &run_end) { self.SetRunEndCallback(run_end); }) .def('wait_life_over', &Tick::WaitLifeOver, py::call_guard<py::gil_scoped_release>());}

編譯出動態庫后,把路徑添加進 PYTHONPATH:

export PYTHONPATH=<path>:$PYTHONPATH# 依賴其他動態庫的話,把路徑添加進 LIBRARY_PATH# Linuxexport LD_LIBRARY_PATH=<path>:$LD_LIBRARY_PATH# macOSexport DYLD_LIBRARY_PATH=<path>:$DYLD_LIBRARY_PATH

之后,就可以于 Python 里調用了:

#!/usr/bin/env python# -*- coding: utf-8 -*-# pylint: disable=missing-docstring, import-errorimport tick_pb as tickdef _main(): t = tick.Tick(lambda elapsed_ms: print(f'elapsed: {elapsed_ms} ms'), 500, 1000, lambda: print('run beg'), lambda: print('run end')) t.start() t.wait_life_over()if __name__ == '__main__': _main()

運行結果:

$ python src/pybind/cpp_thread_callback/tick_test.pyrun begelapsed: 0 mselapsed: 500 mselapsed: 1000 msrun end

示例代碼

tick.h tick.cc tick_test.cc tick_pb.cc tick_test.py

運行示例代碼

獲取代碼,

git clone https://github.com/ikuokuo/start-pybind11.git# 獲取子模塊cd start-pybind11/git submodule update --init

編譯安裝,

# 依賴 cmakecd start-pybind11/make install

編譯結果,

$ tree _install_install├── bin│ └── cpp_thread_callback│ └── tick_test└── lib ├── cpp_thread_callback │ ├── libtick.0.1.0.dylib │ ├── libtick.0.1.dylib -> libtick.0.1.0.dylib │ ├── libtick.dylib -> libtick.0.1.dylib │ ├── tick_pb.0.1.0.cpython-37m-darwin.so │ ├── tick_pb.0.1.cpython-37m-darwin.so -> tick_pb.0.1.0.cpython-37m-darwin.so │ └── tick_pb.cpython-37m-darwin.so -> tick_pb.0.1.cpython-37m-darwin.so └── first_steps ├── first_steps_pb.0.1.0.cpython-37m-darwin.so ├── first_steps_pb.0.1.cpython-37m-darwin.so -> first_steps_pb.0.1.0.cpython-37m-darwin.so ├── first_steps_pb.cpython-37m-darwin.so -> first_steps_pb.0.1.cpython-37m-darwin.so ├── libfirst_steps.0.1.0.dylib ├── libfirst_steps.0.1.dylib -> libfirst_steps.0.1.0.dylib └── libfirst_steps.dylib -> libfirst_steps.0.1.dylib5 directories, 13 files

添加路徑,

$ source setup.bash first_steps cpp_thread_callbackDYLD_LIBRARY_PATH, PYTHONPATH+ /Users/John/Workspace/Self/ikuokuo/start-pybind11/_install/lib/first_steps+ /Users/John/Workspace/Self/ikuokuo/start-pybind11/_install/lib/cpp_thread_callback

運行示例,

$ python src/pybind/cpp_thread_callback/tick_test.pyrun begelapsed: 0 mselapsed: 500 mselapsed: 1000 msrun end

結語

Go coding!

總結

到此這篇關于pybind11: C++ 工程提供 Python 接口的文章就介紹到這了,更多相關pybind11: C++ 工程如何提供 Python 接口內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 中宏网-今日新闻-财经新闻| 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 正压密封性测试仪-静态发色仪-导丝头柔软性测试仪-济南恒品机电技术有限公司 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 |