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.py3.3 運行結果
#python hello.py hello, world4. 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库介绍及简单示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动机器人群体进化控制方法介绍
- 下一篇: 【Python】输入身份证号,输出出生日