c++使用boost.python编写Python扩展

  

很久没有写文章了,今天整理了一些东西,在这里分享一下。

  

最近一直在想用c++封装一些在工作中常用的Python扩展模块,因为之前没有用c++写过类似的东西,因此一直在网上找一些文章,但是我发现好多文章都描述的不是很清晰,对于老鸟来说应该会很容易,但是像我这种初学者,肯定会造成很大的困扰,因为总是出现很多的报的错,搞的头很大,因此我将成功的案例分享一下,并且详细的解释下让我产生疑惑的地方。

  

boost.python

  

<强>简单描述

  

c++写python扩展模块有很多种方式,我选择的是boost.python来编写的,感觉这个要比其他的方式要简单很多,写很少的boost.python代码就可以,这样就可以更专注的去写c++的程序。

  

boost.python的科普就不必多说了,可以自行谷歌,我也是自己谷歌的。

  

<>强安装

  

这里仅介绍Ubuntu的安装方式:

  
 <代码> sudo apt-get安装libboost-all-dev  
  

或者   

 <代码> sudo apt-get libboost-python-dev安装
  #这种方式我没有尝试,你们可以自己试试 
  

源码安装也是可以的,但是需要配置好环境变量,否则编译的时候总是编译不过去,当前直接在编译的时候指定需要的路径也是可以的。

  

实例

  

<强> c++代码

  

下面的例子将一些模糊的点,做了一下描述。

  
 <代码> # include & lt; iostream>
  # include & lt; string>
  # include & lt;提高/python.hpp>//必须引入这个头文件
  
  boost:: python使用名称空间;
  
  HelloWorld类{
  公众:
  HelloWorld (const std:: string&姓名、int年龄);
  
  空白printInfo ();
  
  私人:
  std:: string m_name;
  int m_age;
  };
  
  HelloWorld:: HelloWorld (const std:: string&姓名、int年龄):m_name(名字),m_age(年龄){
  
  }
  
  空白HelloWorld: printInfo () {
  std:: cout & lt; & lt;“我叫“& lt; & lt;m_name & lt; & lt;”、“& lt; & lt;m_age & lt; & lt;“岁了”& lt; & lt;std:: endl;
  }
  
  空白前(){
  std:: cout & lt; & lt;“前”& lt; & lt;std:: endl;
  }
  
  BOOST_PYTHON_MODULE (helloworld) {//类导出成Python可调用的动态链接库文件的方式
  class_ 
  

<强>编译的命令

  

下面的命令是我在编译动态链接库文件的命令,根据自己的实际情况修改。

  
 <代码> # python3
  g++ - shared - o helloworld。所以- fpic - i/usr/include/python3.6m/helloworld。cpp -lpython3.6m -lboost_python3
  
  # python2
  g++ - shared - o helloworld。所以- fpic - i/usr/include/python2.7/helloworld。cpp -lpython -lboost_python
  
  简单介绍下参数
  - shared//指定生成动态链接库
  - o//生成的动态链接库的名称
  fpic//表示使用地址无关代码
  我(大写的我)//表示将/usr/include/python2.7/目录作为第一个寻找头文件的目录,
  - l//指定需连接的库名 
  

没有报错的话会在当前目录下生成一个名叫<代码> helloworld。所以>   

<强>验证结果

  ,
 <代码>祝辞的在比;导入helloworld
  在在在hw=helloworld。helloworld (“lanyulei”, 18)
  在在在hw.printinfo ()
  我叫lanyulei, 18岁了 
  
如果文章中步骤有不对的地方的话,请指出,我会在最快的时间内修改好,谢谢。

c++使用boost.python编写Python扩展