SWIG, Simplified Wrapper and Interface Generator, 是一种软件开发工具,它将C和C++编写的程序与各种高级编程语言连接起来。SWIG可用于不同类型的目标语言,包括常见的脚本语言,如Javascript、Perl、PHP、Python、Tcl和Ruby。支持的语言列表还包括非脚本语言,如C#,D,Go language,Java,包括Android,Lua,OCaml,Octave,Scilab和R。还支持几种解释和编译的Scheme实现(Guile,MzScheme/Racket)
agt-get install swig
用法
1. 创建C文件和头文件
example.c
#include "example.h" int fact(int n) { if (n < 0) { return 0; } if (n == 0) { return 1; } else { return n * fact(n-1); } }
example.h
int fact(int n);
2. 编写swig接口文件 example.i
%module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} int fact(int n)
- %module后面的名字是被封装的模块名称,Python通过这个名称加载程序。
- %{…%}之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。
- 最后一部分,声明了要封装的函数和变量。
swig的简单之处就在于接口文件的编写简单
3. 使用命令行调用 Swig 方法产生 Python 模块
swig -python example.i
执行后会生成2个新的文件:example_wrap.c,example.py
4. 用setup.py 生成so文件
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"], )
导出的.so文件命名需要开头为下划线_
编译生成so文件
python setup.py build_ext --inplace
5. 在C语言程序中调用
test.py
import _example print(_example.fact(4))
SWIG & Python调用C代码
于 2022-06-19 18:28:50 首次发布