前言
由于Semester project要求使用Python在一个C++开源项目上做算法实现,为了避免重复底层实现,需要将C++程序封装成Python可调用的包。目前有许多选择包括Cython,SWIG,boost.python, 不过考虑到不想对代码做改动所以选择了SWIG,因为SWIG仅仅需要添加一个interface文件即可,非常简单易行。但需要注意的是,如果输入输出不是C++标准类型 —— int, float, string等——的话,不支持自动转换,需要自行转换。
SWIG (Simplified Wrapper and Interface Generator)
官方链接为:http://www.swig.org/, 其官网的tutorial比较旧,很多相关的内容都不准确,不建议参考,本文主要参考来源是[1]和[2],主要工作是验证了如何进行生成C++ class的Python对象并进行调用。
1. installation
在命令行中输入以下命令即可安装SWIG
sudo apt install swig python3-dev
2. converting C++ to Python
2.1 介绍和简单测试
SWIG最为核心的部分是 interface 文件,这一文件指出了要将哪些函数接口暴露给Python来进行调用。interface文件以 .i 作为后缀名,基本格式如下:
%module example 声明在Python中调用时所使用的名字,例: import example
%{
#include "example.h" 声明编译所使用的头文件
%}
以下是暴露给Python的变量和函数,在Python中通过使用类似 example.fact(n) 的形式即可使用
extern double a;
extern int func(int n);
使用 interface 文件的方法如下所示,这一步生成c/c++对应的_wrap文件,供编译链接使用。
swig -python -c++ example.i
以下提供一个完整的示例:
# 参考自: http://note.qidong.name/2018/01/hello-swig-example/
1.新建example.c文件,粘贴以下内容,这里是几个简单函数的定义;
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <=