聽說(shuō)宰翅,Python是一門很好的粘合劑語(yǔ)言弃甥。哦,現(xiàn)在出到3版本了汁讼,2版本已停止了任何的新特性添加淆攻。最近常用C/C++寫性能密集型的程序,C++雖好嘿架,奈何處理交互相對(duì)繁瑣瓶珊。于是就想到了使用Python,如果能將C++的性能與Python的靈活結(jié)合起來(lái)耸彪,豈不美哉伞芹?
說(shuō)干就干,上網(wǎng)找到了一些相關(guān)的庫(kù),在其中發(fā)現(xiàn)了一個(gè)叫Boost.Python的東西唱较。其他的庫(kù)大都需要自己去封面向Python的接口扎唾,而用Boost,一個(gè)宏就可以搞定南缓,不得不感嘆Boost的強(qiáng)大胸遇。
Boost中的大多數(shù)模塊在使用的時(shí)候僅需引頭文件,但Boost.Python不然汉形,必須編譯纸镊。我的軟件環(huán)境是:Mint 18.1、Boost 1.64
選定了使用Boost.Python后才發(fā)現(xiàn)資料難找概疆,官方網(wǎng)站上的教程并沒(méi)能帶我飛薄腻,而其他資料中面向Python3 build的太少。于是開始自己跳坑填坑届案,最后成了庵楷。
流程如下:
sudo apt install python3-dev build-essential
./bootstrap.sh --with-python=python3.5
./b2
sudo ./b2 install
根本不用官網(wǎng)上說(shuō)的那個(gè)什么user-config.jam,在運(yùn)行bootstrap.sh時(shí)指定版本就完事(一定要寫Python3啊楣颠,不然build出來(lái)應(yīng)該是2)尽纽。運(yùn)行bootstrap.sh之后目錄下會(huì)生成project-config.jam文件,如果你想使用的Python不在默認(rèn)路徑童漩,就在這個(gè)文件中改弄贿,打開就能找到!
b2相當(dāng)于編譯矫膨,b2 install就是安裝差凹。這里是直接安裝到默認(rèn)路徑(官網(wǎng)上說(shuō)了怎么安裝到其他路徑)。
安裝完以后侧馅,大功告成危尿。趕快編譯一個(gè)庫(kù)嘗試一下。這里使用CMake馁痴。例子是從官網(wǎng)借的谊娇。
//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是因?yàn)槲野l(fā)現(xiàn)在Mint下CMake總是找到Python2而不是3,在Ubuntu中好像沒(méi)有這個(gè)問(wèn)題罗晕。另外BOOST_PYTHON_MODULE宏指定的名字"greet_ext"必須和add_library以及target_link_libraries指定的一致济欢。set_target_properties是用來(lái)去掉生成的庫(kù)的文件名前綴。
好了小渊,到這里全部結(jié)束法褥。編譯,然后打開終端酬屉,進(jìn)入生成庫(kù)(greet_ext.so)所在的目錄半等。呼出python3,
import greet_ext
greet_ext.greet()
有沒(méi)有看到它say hello啊酱鸭?