美文网首页
swig-python对C++的接口

swig-python对C++的接口

作者: codeKing | 来源:发表于2016-09-12 22:50 被阅读0次

前言:

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<string>;
}

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

*7.2. vector<vector<> >

%module example

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include stl.i
namespace std{
%template(stringvector) vector<string>;
%template(stringmat) vector<vector<string> >;
}

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

*7.3. vector<vector<struct> >二维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<point>;
%template(stringmat) std::vector<std::vector<point> >;
}
std::vector<std::vector<point> > getname(int n); 
/*结束
namespace std块中,第一个vector是第二个vector的基础,也就是第一个是第二个的子集,需要先申明内部,然后才能定义更加复杂的部分,比如我之前只定义了如下的namespace std形式:
namespace std{
%template(stringvector) std::vector<double>;
%template(stringmat) std::vector<std::vector<point> >;
}
寻找了好长时间也没找到错误的原因,后来查阅外文资料,才知道这个必须要逐个声明,也就是这里,它不知道std::vector<point>是怎么来的,所以我必须要先声明std::vector<point>才行,即上文形式,这个问题困扰了我好长时间,现在终于解决了.
*/

相关文章

  • swig-python对C++的接口

    前言: swig可以实现多种高级语言(如python,R,Java等)对C/C++的使用,提供一种转换的接口.这里...

  • Ubuntu 16.04 安装opencv的各种方法(含open

    本文主要介绍安装opencv C++接口和python接口的几种方法。 首先介绍C++接口的,然后介绍Python...

  • 探索C++与Go的接口底层实现

    1、C++ 中的“接口” C++并没有明确的“接口”,一般约定继承某个类,已达到接口的“实现”。 首先我们来看下单...

  • JNI&NDK

    JNI: Java Native Interface (Java本地接口,本地接口即C和C++开发的接口) → 调...

  • C++引用C接口

    C++引用C接口 声明的意义

  • Tensorflow的C++推理

    Tensorflow c++ inference Tensorflow c++ 接口加载模型推理单张图片 Tens...

  • 各种加密算法编程演示实验

    实验目的 掌握各种对称算法接口的调用方法(C/C++方式) 掌握各种非对称算法接口的调用方法(C/C++方式) 掌...

  • 一月八号

    OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。 1.using nam...

  • C#调用fmu方法

    C#调用C++接口声明 C++接口参数导致的问题 有如下代码段: func1与func2的导出接口参数类型分别为c...

  • 探究golang接口

    今天看了《Go 语言中的方法,接口和嵌入类型》所以想对比以前对C/C++相关知识进一步理解golang的接口、指针...

网友评论

      本文标题:swig-python对C++的接口

      本文链接:https://www.haomeiwen.com/subject/wptmettx.html