日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:18日期: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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产欧美三级| 成人福利视频| 久久国产亚洲精品| 麻豆一区在线| 久久精品资源| 日本 国产 欧美色综合| 亚洲国产日韩欧美在线| 午夜在线视频观看日韩17c| 亚洲伊人精品酒店| 青草国产精品久久久久久| 久久国产视频网| 开心激情综合| 午夜精品婷婷| 国产精品欧美日韩一区| 韩国三级一区| 在线日韩一区| 欧美专区一区二区三区| 亚洲精品在线二区| 日韩精品视频网| 国产精品欧美三级在线观看 | 国产白浆在线免费观看| 欧洲精品一区二区三区| 欧美1级日本1级| 视频一区在线播放| 青青伊人久久| 国语精品一区| 国产精品91一区二区三区| 免费看黄色91| 五月天久久网站| 日韩不卡一二三区| 免费亚洲一区| 1000部精品久久久久久久久| 石原莉奈一区二区三区在线观看| 欧美一级网站| 色婷婷综合网| 久久xxxx| 麻豆高清免费国产一区| 欧美+日本+国产+在线a∨观看| 亚洲永久av| 精品久久美女| 亚洲精品一区三区三区在线观看| 日韩av免费大片| 91精品蜜臀一区二区三区在线| 日韩高清在线一区| 美女国产一区二区三区| 国产成人精品福利| 亚洲福利精品| 国产欧美视频在线| 91精品综合| 日韩高清电影一区| 欧洲一级精品| 青青国产精品| 国产综合视频| 亚洲一区不卡| 韩国女主播一区二区三区| 午夜在线精品偷拍| 国产一区二区三区免费在线| aⅴ色国产欧美| 精品日韩一区| 中文字幕免费一区二区| 精品国产99| 在线一区视频| 久久久久久一区二区| 亚洲精品免费观看| 欧洲一级精品| 国产伦精品一区二区三区在线播放| 日韩福利一区| 精品一区亚洲| 国产在线日韩精品| 一区二区国产在线| 国产aa精品| 中文字幕一区二区精品区| 91亚洲人成网污www| 国产精品试看| 国内自拍视频一区二区三区| 伊人久久亚洲热| 久久97久久97精品免视看秋霞| 婷婷综合在线| 国产粉嫩在线观看| 88久久精品| 热久久久久久久| 日韩一区欧美| 免费在线成人| 欧美日韩中文| 久久国产66| 久久免费高清| 蜜桃久久久久| 亚欧洲精品视频在线观看| 福利一区在线| 97成人超碰| 欧美日韩国产在线一区| 国产aⅴ精品一区二区三区久久| 综合亚洲自拍| 国产在线成人| 日韩国产综合| 久久伊人国产| 欧美片第1页综合| 男人的天堂久久精品| 91亚洲自偷观看高清| 欧美天堂一区二区| 亚洲深深色噜噜狠狠爱网站| 亚洲午夜黄色| 手机在线电影一区| 国产精品一站二站| 亚洲精品伊人| 免费成人网www| 欧美日韩在线观看首页| 久久久久观看| 久久国产视频网| 亚洲视频国产精品| 天堂va蜜桃一区二区三区| 蜜臀久久99精品久久一区二区| 欧美香蕉视频| 福利一区在线| 精品中文在线| 国产精品久久| 久久精品99久久久| 日本不卡视频在线观看 | 国产精品三p一区二区| 国产亚洲一区在线| 欧美91福利在线观看| 日韩欧美精品| 国产传媒在线| 日韩成人综合| 日韩成人三级| 久久婷婷一区| 欧美男人天堂| 日本在线高清| 欧美激情国产在线| 久久中文欧美| 精品一区二区三区免费看 | 日韩激情av在线| 蜜臀av一区二区在线免费观看| 伊人久久婷婷| 久久午夜视频| 亚洲综合婷婷| 深夜福利亚洲| 人人精品久久| 国产精品久久久久久久久久齐齐| 麻豆精品新av中文字幕| 久久精品人人| av中文字幕在线观看第一页| 中文字幕在线看片| 香蕉视频亚洲一级| 久久国产精品成人免费观看的软件| 视频福利一区| 免费观看不卡av| 久久中文字幕av| 免费观看不卡av| 香蕉成人久久| 欧美一区二区三区久久| 久久中文在线| 婷婷综合六月| 午夜久久久久| 蜜桃视频在线观看一区二区| 深夜福利亚洲| 免费在线成人| 激情亚洲影院在线观看| 一区二区三区四区在线看| 三级一区在线视频先锋| 97久久中文字幕| 精品理论电影在线| 成人国产精选| 欧美日韩在线网站| 丝袜美腿高跟呻吟高潮一区| 日韩和欧美一区二区三区| 老司机免费视频一区二区三区| 亚洲永久av| 日韩中文字幕麻豆| 国产精品成人国产| 91tv亚洲精品香蕉国产一区| 欧美日韩精品一本二本三本| 日韩一区网站| 国产999精品在线观看| 亚洲小说欧美另类婷婷| 一区二区三区四区日韩| 国产精品超碰| 日韩国产欧美一区二区| 国产一区白浆| 国产精品永久| 偷拍精品精品一区二区三区| 99热精品在线观看| 国产毛片精品久久| а√在线中文在线新版| 夜夜精品视频| 国产精品啊啊啊| 美女网站一区| 免费精品一区| aa国产精品| 美女在线视频一区| 国内精品99| 国产日韩欧美一区二区三区| 国产日韩欧美中文在线| 成人福利av| 日韩不卡在线观看日韩不卡视频 | 久久激五月天综合精品| 尤物tv在线精品| 国产日韩欧美一区| 99国产精品一区二区| 日韩黄色av|