天天看點

linux+swig+python,swig-python對C++的接口

前言:

swig可以實作多種進階語言(如python,R,Java等)對C/C++的使用,提供一種轉換的接口.這裡由于項目的需要,介紹下Python對C++的支援.(本文部分參考其它網絡文章,但代碼均經過驗證可行)

安裝SWIG(ubuntu 14.04):

1.安裝pcre(pcre提供對正規表達式的支援)

sudo apt-get update

sudo apt-get install libpcre3 libpcre3-dev

可能還需要安裝:

sudo apt-get install openssl libssl-dev

2.安裝SWIG:

sudo apt-get install swig

安裝結束

簡單使用

1.用c++語言編寫頭檔案和源檔案為:

頭檔案example.h:

int fact(int n);

源檔案example.cpp:

#include "example.h"

int fact(int n){

if(n<0){

return 0;

}

if(n==0){

return 1;

}

else{

return (1+n)*fact(n-1);

}

}

2.寫swig子產品寫一個檔案example.i:

%module example

%{

#define SWIG_FILE_WITH_INIT

#include "example.h"

%}

int fact(int n);

3.使用swig生産cxx檔案,建python子產品:

swig -c++ -python example.i

執行完指令後會生成兩個不同的檔案:example_wrap.cxx和example.py.

4.最後一步,利用python自帶工具distutils生成動态庫:

python自帶一個distutils工具,可以用它來建立python的擴充子產品.

要使用它,必須先定義一個配置檔案,通常是命名為setup.py

"""

setup.py

"""

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"],

)

注意:頭檔案和源檔案都是example.*,那麼setup.py腳本中Extension的參數必須為"_example"

5.編譯

python setup.py build_ext --inplace

6.測試

python指令行:

>>>import example

>>>example.fact(4)

24

>>>

*7.支援STL

*7.1. vector

%module example

%{

#define SWIG_FILE_WITH_INIT

#include "example.h"

%}

%include stl.i

namespace std{

%template(VectorOfString) vector;

}

int fact(int n);

std::vector<:string> getname(int n);

*7.2. vector >

%module example

%{

#define SWIG_FILE_WITH_INIT

#include "example.h"

%}

%include stl.i

namespace std{

%template(stringvector) vector;

%template(stringmat) vector >;

}

int fact(int n);

std::vector<:vector> > getname(int n);

*7.3. vector >二維vector(多元vector定義+struct)

%module example

%{

#define SWIG_FILE_WITH_INIT

#include "example.h"

%}

%include stl.i

struct point

{

int i;

int j;

};

namespace std{

%template(stringvector) std::vector;

%template(stringmat) std::vector<:vector> >;

}

std::vector<:vector> > getname(int n);