1. SWIG
SWIG 允许向广泛的脚本语言公开 C/C++ 代码,包括 Ruby、Perl、Tcl 和 Pytxhon等。
- SWIG (Simplified Wrapper and Interface Generator) 简单的包装和接口生成器
- SWIG 可以 把C++代码封装成Python库
- SWIG 实际上是一个编译器,获取C/C++的声明,用一个壳包起来,以便通过其他语言访问这些声明。
因此,SWIG 最大的好处就是将脚本语言的开发效率和 C/C++ 的运行效率结合起来。
2. C语言实例
2.1 编写 .h 和 .c 文件
.h 声明方法
int fact(int n);
.c 实现
#include "example.h"
int fact(int n) {
if (n < 0) {
return 0;
}
if (n == 0) {
return 1;
}
else {
return n * fact(n-1);
}
}
2.2 编写 .i 接口文件
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
int fact(int n);
-
%module
后面的名字是被封装的模块名称,Python通过这个名称加载程序。 -
%{...%}
之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。 - 最后一部分,声明了要封装的函数和变量。
2.3 命令行调用 Swig 方法产生 Python 模块
Swig -python example.i
会自动生成 2 个文件:example_wrap.c
,example.py
。
2.4 利用 distutils 生成动态库
新建 setup.py
,程序模板如下:
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example_wrap.c', 'example.cpp'],
)
setup(name='example',
version='0.1',
author="SWIG Docs",
description="""Simple swig example from docs""",
ext_modules=[example_module],
py_modules=["example"],
)
2.5 编译生成上图红色框中的库
python setup.py build_ext --inplace
2.6 测试代码
import example
print(example.fact(4))
24
3. C++ 实例
同 C 基本一样
区别1:2.3 部分调用
Swig -c++ -python example.i
生成文件:example_wrap.cxx
,example.py
。
区别2:2.4 setup.py
其实只是 sources 部分文件不同
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example_wrap.cxx', 'example.cpp'],
)
setup(name='example',
version='0.1',
author="SWIG Docs",
description="""Simple swig example from docs""",
ext_modules=[example_module],
py_modules=["example"],
)
剩下的 编译 测试 都一样。