Ubuntu16.04下通过 SWIG 将 C++ function/class/namespace 转换为 Python 下可调用的module

本文详细介绍了如何使用SWIG将C++代码封装为Python可调用的模块,包括基本设置、class和namespace的处理,以及如何在涉及外部库的情况下进行编译。通过具体示例,展示了从创建interface文件到编译测试的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

由于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 <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值