听说,Python是一门很好的粘合剂语言。哦,现在出到3版本了,2版本已停止了任何的新特性添加。最近常用C/C++写性能密集型的程序,C++虽好,奈何处理交互相对繁琐。于是就想到了使用Python,如果能将C++的性能与Python的灵活结合起来,岂不美哉?
说干就干,上网找到了一些相关的库,在其中发现了一个叫Boost.Python的东西。其他的库大都需要自己去封面向Python的接口,而用Boost,一个宏就可以搞定,不得不感叹Boost的强大。
Boost中的大多数模块在使用的时候仅需引头文件,但Boost.Python不然,必须编译。我的软件环境是:Mint 18.1、Boost 1.64
选定了使用Boost.Python后才发现资料难找,官方网站上的教程并没能带我飞,而其他资料中面向Python3 build的太少。于是开始自己跳坑填坑,最后成了。
流程如下:
sudo apt install python3-dev build-essential
./bootstrap.sh --with-python=python3.5
./b2
sudo ./b2 install
根本不用官网上说的那个什么user-config.jam,在运行bootstrap.sh时指定版本就完事(一定要写Python3啊,不然build出来应该是2)。运行bootstrap.sh之后目录下会生成project-config.jam文件,如果你想使用的Python不在默认路径,就在这个文件中改,打开就能找到!
b2相当于编译,b2 install就是安装。这里是直接安装到默认路径(官网上说了怎么安装到其他路径)。
安装完以后,大功告成。赶快编译一个库尝试一下。这里使用CMake。例子是从官网借的。
//greet.h
#ifndef GREET_H_
#define GREET_H_
char const *greet();
#endif // GREET_H_
//greet.cpp
#include "greet.h"
char const *greet() {
return "Hello world";
}
//greet_ext.cpp
#include "greet.h"
#include <boost/python.hpp>
BOOST_PYTHON_MODULE (greet_ext)
{
using namespace boost::python;
def("greet", greet);
}
#CMakeLists.txt
cmake_minimum_required(VERSION 3.7)
project(untitled)
# Find necessary packages
find_package(PythonLibs 3.5 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIR})
find_package(Boost COMPONENTS python3 REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES greet_ext.cpp greet.cpp greet.h)
set(PYTHON_INCLUDE_DIR "/usr/include/python3.5")
add_library(greet_ext SHARED ${SOURCE_FILES})
target_link_libraries(greet_ext ${Boost_LIBRARIES})
set_target_properties(greet_ext PROPERTIES PREFIX "")
之所以指定PYTHON_INCLUDE_DIR是因为我发现在Mint下CMake总是找到Python2而不是3,在Ubuntu中好像没有这个问题。另外BOOST_PYTHON_MODULE宏指定的名字"greet_ext"必须和add_library以及target_link_libraries指定的一致。set_target_properties是用来去掉生成的库的文件名前缀。
好了,到这里全部结束。编译,然后打开终端,进入生成库(greet_ext.so)所在的目录。呼出python3,
import greet_ext
greet_ext.greet()
有没有看到它say hello啊?
网友评论