功能目的:用c++写一个功能,然后用swig将c++写得功能封装成一个python库,然后在python中可以直接import 调用。
注:SWIG 实际上是一个编译器,获取C/C++的声明,用一个壳包起来,以便通过其他语言访问这些声明。因此,SWIG 最大的好处就是将脚本语言的开发效率和 C/C++ 的运行效率结合起来。
1.安装 swig
sudo apt-get install swig
输入:swig -version
查看是否安装成功,成功会出现:
SWIG Version 3.0.12
Compiled with g++ [x86_64-pc-linux-gnu]
Configured options: +pcre
Please see http://www.swig.org for reporting bugs and further information
2.写一个c++头文件 example.h
#include <iostream>
using namespace std;
class Example{
public:
void say_hello();
};
3.写个c++源文件example.cpp,对头文件中的方法进行实现
#include "example.h"
void Example::say_hello(){
cout<<"hello"<<endl;
}
4.写一个".i"文件example.i,将c++写得功能方法打包成扁平的接口
%module example
%{
#include "example.h"
%}
%include "example.h"
a.%module后面的名字是被封装的模块名称,Python通过这个名称加载程序。
b.%{…%}之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。
c.最后一部分,声明了要封装的函数和变量。
5.写一个setup.py文件,将接口打包生成一个 模块
#!/usr/bin/env python
"""
setup.py file for SWIG C\+\+/Python example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example.cpp', 'example_wrap.cxx',],
)
setup (name = 'example',
version = '0.1',
author = "www.99fang.com",
description = """Simple swig C\+\+/Python example""",
ext_modules = [example_module],
py_modules = ["example"],
)
6.执行以下命令,来加载c++
swig -c\+\+ -python example.i
python setup.py build_ext --inplace
"swig -c++ -python example.i"命令生成了两个文件:example_wrap.cxx, example.py。example_wrap.cxx里会对Example类提供类使以下的扁平接口:
Example* new_Example();
void say_hello(Example* example);
viod delete_Example(Example *example);
这个接口被编译到_example.so里,_example可以做为一个Python module直接加载到Python解释器中。example.py利用_example里提供的接口,将扁平的接口还原为Python的Example 类,这个类做为C++ Example类的代理类型,这样使用方式就更加自然了。
7.python后,输入以下内容,便可以完成简单的python 导入c++写得功能
>>> import example
>>> example.Example().say_hello()
hello