Python扩展之boost.python

1,安装boost

sudo apt-get install python-dev libxml2-dev libxslt-dev

下载boost源代码https://www.boost.org/users/download/解压开。

2,

./bootstrap.sh --with-python=/home/jt/tfenv3/bin/python3
sudo ./b2 cxxflags=-fPIC cflags=-fPIC --c++11
sudo ./b2 install 

3,建立一个 test.cpp文件测试

gedit test.cpp
#include<iostream>
#include<boost/bind.hpp>
using namespace std;
using namespace boost;
int fun(int x, int y){return x+y;}
int main(){
    int m=1; int n=2;
    cout<<boost::bind(fun,_1,_2)(m,n)<<endl;
    return 0;
 }
g++ test.cpp -o test
./test

输出3,boost安装完成

4,用boost.python库导出C++函数
新建测试文件hello.cpp:

#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
void SayHello()
{
    std::cout<<"hello, world!"<<std::endl;
}
void SayBye()
{
    std::cout<<"good bye!"<<std::endl;
}
BOOST_PYTHON_MODULE(hello)   // generate python module hello
{
    def("SayHello", SayHello);
    def("SayBye", SayBye);
}

编译:

g++ hello.cpp -shared -fPIC -o hello.so -I ~/Downloads/boost_1_67_0 -L ~/Downloads/boost_1_67_0/stage/lib -lboost_python -I /home/jt/tfenv3/bin/python3

生成hello.so
进入python:

import hello
hello.SayHello()

输出:hello, world!

5,用boost.python库导出C++类:
新建helloclass.cpp:

#include <string>
#include <boost/python.hpp>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace std;
class CHello{
public:
    string GetString()
    {
        return "CHello::GetString()";
    }
    int GetInt()
    {
        return 100;
    }
};
BOOST_PYTHON_MODULE(hello_class)
{
    using namespace boost::python;
    class_<CHello>("CHello")
      .def("GetString",&CHello::GetString)
      .def("GetInt",&CHello::GetInt)
    ;
}

编译:

g++ helloclass.cpp -shared -fPIC -o hello_class.so -I ~/Downloads/boost_1_67_0 -L ~/Downloads/boost_1_67_0/stage/lib -lboost_python -I /home/jt/tfenv3/bin/python3

进入python:

import hello_class
a = hello_class.CHello()
a.GetInt()

输出:100

6:,用boost.python库导出构造函数
新建class.cpp:

#include <string>
#include <boost/python.hpp>
using namespace std;
class CHello{
public:
    CHello(string msg)
        : m_msg(msg)
    {
        m_id = 0;
    }
    CHello(int id)
    {
        m_id = id;
    }
    string GetString() const
    {
        return m_msg;
    }
    string SetString(string msg)
    {
        m_msg = msg;
    }
    int GetInt()
    {
        return m_id;
    }
    int SetInt(int id)
    {
        m_id = id;
    }
    string m_msg;
    int m_id;
};
BOOST_PYTHON_MODULE(hello_class)
{
    using namespace boost::python;
    class_<CHello>("CHello", init<string>())
      .def(init<int>())
      .def("SetString", &CHello::SetString)
      .def("GetString", &CHello::GetString)
      .def("GetInt", &CHello::GetInt)
    ;
}

编译:

g++ class.cpp -shared -fPIC -o hello_class.so -I ~/Downloads/boost_1_67_0 -L ~/Downloads/boost_1_67_0/stage/lib -lboost_python -I /home/jt/tfenv3/bin/python3

进入python:

import hello_class
b = hello_class.CHello("hello world!")
b.GetString()

‘hello world!’

7,生成自己相机驱动程序的python库!

g++ main.cpp -shared -fPIC -o mv.so -I ~/Downloads/boost_1_67_0 -L ~/Downloads/boost_1_67_0/stage/lib  -lMVSDK -lboost_python-py35 -I /home/jt/tfenv3/include/python3.5m -I ./
其中:
boost_python-py35对应/usr/lib/x86_64-linux-gnu目录下的libboost_python-py35.so
-I:编译程序按照-I指定的路进去搜索头文件
-L:编译程序按照-L指定的路进去寻找库文件,一般的在-L的后面可以一次用-l指定多个库文件(例如上面的-lboostpython)
-o:指定生成可执行文件的名称。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值