1. 程式人生 > >Boost Python官方樣例(一)

Boost Python官方樣例(一)

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官方樣例(一)