日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Boost(2):boost.python库介绍及简单示例

發布時間:2023/12/29 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost(2):boost.python库介绍及简单示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. boost.python介紹

將c/c++的函數接口轉換為Python接口有好幾種解決方案,不同于C語言的簡單直接,C++因使用了大量的面向對象編程的思想導致轉換為Python接口時相對比較復雜,boost.python的目標就是為了簡單方便地將C++程序轉換成Python的接口。

BoostPython庫是boost c++庫的其中一個子庫,使用它可以輕松地將C++的函數接口轉換成Python接口。在大部分情況下你不需要對原先的C++代碼做任何修改,boost.python會對C++類再做一層封裝,使它編譯后符合Python的語言規范。

2. 簡單例程

按照程序員的江湖規矩,一個新的學習開始時,首先從HelloWorld程序下手。在這個例程中,首先使用c++函數輸出"hello world",然后將這個函數封裝成python的接口,在python環境下調用該函數實現打印。

注:本文例程運行在boost_1_73_0版本下。

整體文件結構如下:

/boost$ tree ├── 01_HelloWorld │ ├── CMakeLists.txt │ ├── hello.py │ └── HelloWorld.cpp └── CMakeLists.txt1 directory, 4 files

創建boost目錄用于保存后續的示例代碼,boost目錄下的CMakeLists.txt主要完成必要的庫的查找工作,如這里會用到Python和Boost,然后再添加子目錄下的CMakeLists.txt文件。


2.1 主目錄下的CMakeLists.txt

內容如下:

project(Boost_Test) cmake_minimum_required(VERSION 2.8.3)# find python find_package(PythonInterp REQUIRED) find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)# now search for the boost component # depending on the boost version it is called either python, # python2, python27, python3, python36, python37, ... list(APPEND _componentspython${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}python${PYTHON_VERSION_MAJOR}python)message(BOOST_ROOT " ${BOOST_ROOT}")set(_boost_python_found "") set(Boost_NAMESPACE "libboost") set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_STATIC_RUNTIME OFF) foreach(_component IN ITEMS ${_components})find_package(Boost COMPONENTS ${_component})if(Boost_FOUND)set(_boost_python_found ${_component})break()endif() endforeach()#if(_boost_python_found STREQUAL "") # message(FATAL_ERROR "No matching Boost.Python component found") #endif()include_directories("${PYTHON_INCLUDE_DIRS}") include_directories("${Boost_INCLUDE_DIRS}") message(PYTHON_INCLUDE_DIRS " ${PYTHON_INCLUDE_DIRS}") message(PYTHON_LIBRARIES " ${PYTHON_LIBRARIES}") message(Boost_INCLUDE_DIRS " ${Boost_INCLUDE_DIRS}") message(Boost_LIBRARIES " ${Boost_LIBRARIES}")ADD_SUBDIRECTORY(01_HelloWorld)


2.2 HelloWorld.cpp

char const* greet() {return "hello, world"; }#include <boost/python.hpp>BOOST_PYTHON_MODULE(hello) {using namespace boost::python;def("greet", greet); }


2.3 hello.py

#!/usr/bin/env pythonimport hello print (hello.greet())


2.4 子目錄下的CMakeLists.txt

這個文件主要完成編譯庫文件以及鏈接工作,注意MODULE_NAME必須與BOOST_PYTHON_MODULE()下的相同,比如這里都是hello。

set(MODULE_NAME hello)include_directories(${CMAKE_SOURCE_DIR})add_library(${MODULE_NAME} SHAREDHelloWorld.cpp)if (UNIX)set_target_properties(${MODULE_NAME}PROPERTIESPREFIX "") elseif (WIN32)set_target_properties(${MODULE_NAME}PROPERTIESSUFFIX ".pyd") endif()target_link_libraries(${MODULE_NAME}${Boost_LIBRARIES}${PYTHON_LIBRARIES} )

對于windows系統,編譯的python模塊應該以".pyd"為后綴。而對于linux系統,默認會在模塊名稱前加"lib",而Boost.Python要求模塊名稱和庫文件名稱保持一致,所以這里要聲明不對庫文件添加前綴。

3. 編譯運行

3.1 編譯

cd boost mkdir build cmake .. make

之后,在build/01_HelloWorld目錄下會生成hello.so的庫文件。

3.2 運行

cd 01_HelloWorld# 在不install so的情況下,將python文件拷貝到so目錄 cp ../../01_HelloWorld/hello.py .python hello.py


3.3 運行結果

#python hello.py hello, world


4. Boost接口

4.1 BOOST_PYTHON_MODULE宏

這個宏定義在boost/python/module.hpp文件下,該文件提供了創建Boost.Python擴展模塊的基本工具。目前也只有這個宏。

BOOST_PYTHON_MODULE用于聲明python模塊初始化函數,其使用格式如下:

BOOST_PYTHON_MODULE(name) {... }

name 參數必須與要初始化的模塊的名稱完全匹配,并且必須符合 Python 的標識符命名規則。

4.2 def

def接口是Boost.Python提供的自由函數版本,它能將當前作用域中的函數轉換為python的接口,如示例中的greet()函數。后面還會看到有轉換類內函數的版本。

def的使用方式如下:

#include <boost/python.hpp>BOOST_PYTHON_MODULE(my_module) {def("name", function_ptr);def("name", function_ptr, call_policies);def("name", function_ptr, "documentation string");def("name", function_ptr, call_policies, "documentation string"); }

其中name表示python接口下的函數名稱,可以與c++的名稱不同。function_ptr是對應的c++函數指針,即函數名。call_policies在后面用到的時候再詳細說明。


參考資料

https://wiki.python.org/moin/boost.python/GettingStarted

https://www.boost.org/doc/libs/1_78_0/libs/python/doc/html/tutorial/index.html

https://www.boost.org/doc/libs/1_78_0/libs/python/doc/html/reference/high_level_components/boost_python_module_hpp.html

總結

以上是生活随笔為你收集整理的Boost(2):boost.python库介绍及简单示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。