Python.Boost是让Python能够更直接自由的调用C++函数和类的库。这个库的产生是为了提高Python的效率。这里这个笔记介绍如何使用这样一个强大的工具。
安装指南
笔者使用homebrew管理包,之前使用homebrew安装了2.7.9版本的Python(这使得后面出现了cmake错误,后面再说)。首先安装boost库
brew install boost
接着安装Python.Boost
brew install boost-python
这里笔者安装的为1.59.0版本的boost和对应的Python.Boost
Hello World
首先介绍如何写一个Python.Boost的Hello World。在代码中我们使用C++实现一个返回字符串 "hello, world"
的函数并将其添加到模块中,C++函数如下:
char const* greet() {
return "hello, world"
}
我们希望将其转化为Python能调用的包,这里我们要使用Boost.Python的功能,将greet
函数定义为python能够调用的函数
#include <boost/python/mudule.hpp>
#include <boost/python/def.hpp>
BOOST_PYTHON_MODULE(hello) {
using namespace boost::python;
def("greet", greet);
};
这里应该是用到了Boost.Python中定义的宏来进行转化,具体内容以后会仔细研读。
之后就是编译的需要,这里使用cmake,没有采用boost的bjam,具体是因为对于bjam还不熟,cmake比较熟悉一点。
cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)
上面会自动需找所需要的一些包,然后可以添加子目录,比如我们将上面的hello.cpp
放在hello-world
目录下,我们就添加如下子目录
ADD_SUBDIRECTORY(hello-world)
在hello-world
目录下我们插入如下cmake命令
PYTHON_ADD_MODULE(hello hello.cpp)
这样按照平常的cmake习惯进行配置编译即可
brew管理下的特殊命令
如果之前使用brew安装过Python并且使用brew管理boost库,可能会出现在使用Python调用自己所写的类的时候出现错误,这是因为cmake找到的Python库为系统自带的库而非brew编译的库,这时候需要在cmake的时候加入指定Python的命令,以2.7为例:
cmake -DPYTHON_LIBRARY=/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib
后面在如平常加入路径
备注
- 需要注意cpp文件中
BOOST_PYTHON_MODULE
后面的名字需要和cmake中的PYTHON_ADD_MODULE
保持一直,否则会报init函数的错误 - 不知道为什么如果不include<sstream>的时候会报错。
网友评论