Boost Python官方樣例(一)
阿新 • • 發佈:2018-05-25
library OS get hpa mkdir 成員 ubun int AR
配置環境
$ cat /etc/os-release NAME="Ubuntu" VERSION="16.04 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" UBUNTU_CODENAME=xenial # apt install libboost-python-dev cmake
導出C++函數
創建工程目錄
$ mkdir Lesson1
$ cd Lesson1
編寫C++函數實現
$ vim greet.cpp
char const* greet()
{
return "hello world";
}
編寫Boost.Python文件
$ vim greet_wrapper.cpp #include <boost/python.hpp> #include "greet.cpp" BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); }
為庫編寫CMakeLists.txt
$ vim CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(greet) ### 此處的動態庫名必須和BOOST_PYTHON_MODULE()中定義的保持一致,即最後生成的庫必須名為hello_ext.so set(greetSRC greet_wrapper.cpp) add_library(hello_ext SHARED ${greetSRC}) set_target_properties(hello_ext PROPERTIES PREFIX "") #dependencies INCLUDE(FindPkgConfig) pkg_check_modules(PYTHON REQUIRED python) include_directories(/usr/include ${PYTHON_INCLUDE_DIRS}) target_link_libraries(hello_ext boost_python)
編譯庫
$ mkdir build
$ cd build
$ cmake ..
$ make
運行python測試庫文件
### 在build目錄下執行,即hello_ext.so存在的目錄(可以將so移至其他目錄,這樣就可以在其他目錄下打開python終端)
$ python
>>> import hello_ext
>>> help(hello_ext)
>>> hello_ext.greet()
‘hello world‘
導出C++類
編寫C++類實現
$ vim world.h
#include <string.h>
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
編寫Boost.Python文件
$ vim world_wrapper.cpp
#include <boost/python.hpp>
#include "world.h"
using namespace boost::python;
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
運行python測試庫文件
$ python
>>> import hello
>>> planet = hello.World()
>>> planet.set(‘howdy‘)
>>> planet.greet()
‘howdy‘
導出C++類(帶構造函數)
編寫C++類實現
$ cat world.h
#include <string.h>
struct World
{
World(std::string msg): msg(msg) {} // added constructor
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
編寫Boost.Python文件
$ vim world_wrapper.cpp
#include <boost/python.hpp>
#include "world.h"
using namespace boost::python;
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World", init<std::string>())
.def("greet", &World::greet)
.def("set", &World::set)
;
}
運行python測試庫文件
>>> import hello
>>> planet = hello.World("test")
>>> planet.greet()
‘test‘
導出C++類(帶數據成員)
編寫C++類實現
$ vim var.h
#include <string.h>
struct Var
{
Var(std::string name) : name(name), value() {}
std::string const name;
float value;
};
編寫Boost.Python文件
$ vim var_wrapper.cpp
#include <boost/python.hpp>
#include "var.h"
using namespace boost::python;
BOOST_PYTHON_MODULE(hello)
{
class_<Var>("Var", init<std::string>())
.def_readonly("name", &Var::name)
.def_readwrite("value", &Var::value);
}
運行python測試庫文件
>>> import hello
>>> x = hello.Var(‘pi‘)
>>> x.value = 3.14
>>> print x.name, ‘is around‘, x.value
pi is around 3.1400001049
Boost Python官方樣例(一)