文档章节

python 利用swig 调用c++的接口。

 混世太保
发布于 2017/02/25 18:27
字数 698
阅读 54
收藏 0

本文所用例子是 swig2.0-examples里Python的class目录里的代码。

具体的c++ 代码如下所示。

/* File : example.h */

class Shape {
public:
  Shape() {
    nshapes++;
  }
  virtual ~Shape() {
    nshapes--;
  };
  double  x, y;   
  void    move(double dx, double dy);
  virtual double area(void) = 0;
  virtual double perimeter(void) = 0;
  static  int nshapes;
};

class Circle : public Shape {
private:
  double radius;
public:
  Circle(double r) : radius(r) { };
  virtual double area(void);
  virtual double perimeter(void);
};

class Square : public Shape {
private:
  double width;
public:
  Square(double w) : width(w) { };
  virtual double area(void);
  virtual double perimeter(void);
};


/* 文件名是example.cxx*/
/* File : example.c */

#include "example.h"
#define M_PI 3.14159265358979323846

/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
  x += dx;
  y += dy;
}

int Shape::nshapes = 0;

double Circle::area(void) {
  return M_PI*radius*radius;
}

double Circle::perimeter(void) {
  return 2*M_PI*radius;
}

double Square::area(void) {
  return width*width;
}

double Square::perimeter(void) {
  return 4*width;
}

  

python接口的文档如下所示,后缀通常都是python.i.

module 对应着具体so的名字。在生成的py文件里。会import _{module}.so。

/* File : example.i */
%module example

%{
#include "example.h"
%}

/* Let's just grab the original header file here */
%include "example.h"

调用 下行命令生成 example_wrap.cxx, 和example.py 文件。

xxx@xxx-K43SJ:/usr/share/doc/swig2.0-examples/python/class$ sudo swig2.0 -c++ -python example.i 

调用如下命令生成example.o

sudo g++ -O2 -fPIC -c example.cxx

调用如下命令生成example_wrap.o -I 是用来链接example_wrap.cxx 里的Python.h的头文件。

如果没有包含这个头文件。则apt-get 下个python的dev包。

sudo g++ -O2 -fPIC -c example_wrap.cxx -I /usr/include/python2.7/ 

再调用如下命令生成c++ 的so文件。so文件的名字文件对应着.i文件里的module而且要加_

 sudo g++ -shared *.o -o _example.so

这时候,我们调用python

xxx@xxx-K43SJ:/usr/share/doc/swig2.0-examples/python/class$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from example import *
>>> dir()
['Circle', 'Circle_swigregister', 'Shape', 'Shape_swigregister', 'Square', 'Square_swigregister', '__builtins__', '__doc__', '__name__', '__package__', 'cvar']
>>> c = Circle(10)
>>> dir(c)
['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', '_s', 'area', 'move', 'nshapes', 'perimeter', 'this', 'x', 'y']
>>> c.area()
314.1592653589793
>>> c.perimeter()
62.83185307179586
>>> c.nshapes()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> c.nshapes
1
>>> 

 

还有另外一种编译的方式。用distutils来编译。写脚本如下,setup.py

#!/usr/bin/env python

"""
setup.py file for SWIG example
"""

from distutils.core import setup, Extension


example_module = Extension('_example',
                           sources=['example_wrap.cxx', 'example.cxx'],
                           )

setup (name = 'example',
       version = '0.1',
       author      = "SWIG Docs",
       description = """Simple swig example from docs""",
       ext_modules = [example_module],
       py_modules = ["example"],
       )

 调用如下命令编译得到py文件和so文件。

sudo python setup.py build_ext --inplace

接下来说说编译多个.cxx或.cpp文件

用g++ 文件的方式编译链接so时在这个命令里把其他.cxx文件也一起编译成.o,也可以将*_wrap.cxx一起编译成.o ,这时候也要添加Python.h的链接路径。接下来把他们链接成so。就可以了。

sudo g++ -O2 -fPIC -c *.cxx

第二种方法。

在soureces里添加其他要添加的cxx。Extension还可以添加其他要链接的so。

example_module = Extension('_example',
                           sources=['example_wrap.cxx', 'example.cxx', 'hello.cxx'],
                           )

 

© 著作权归作者所有

共有 人打赏支持
上一篇: NULL 和nullptr区别
下一篇: apt-get install
粉丝 0
博文 25
码字总数 11812
作品 0
厦门
私信 提问
SWIG入门6: Python Proxy Class和Builtin Type

在前几篇文章中,从一个较高的层次上说明了SWIG的基本用法。这篇文章会深入到SWIG的一些实现的细节中。SWIG默认的封装方式,是把C/C++的struct和class封装到Python Proxy Class中。不过从SWI...

costaxu
2012/09/08
0
0
C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0
04/21
0
0
TensorFlow架构与设计:会话生命周期

TensorFlow的系统结构以C API为界,将整个系统分为「前端」和「后端」两个子系统: 前端系统:提供编程模型,负责构造计算图; 后端系统:提供运行时环境,负责执行计算图。 前端系统主要扮演...

刘光聪
2017/03/04
0
0
Windows上如何使用SWIG (c++ android 示例)

SWIG介绍 SWIG (Simplified Wrapper and Interface Generator) ,即简化包以及接口生成器,为脚本语言(tcl,perl,python等)提供了C和C++的接口。SWIG在1995年在Los Alamos National Laborat...

u014644594
05/28
0
0
SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘
06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新手也能看懂,消息队列其实很简单

该文已加入开源项目:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目,Star 数接近 16k)。地址:https://github.com/Snailclimb/JavaGuide. 本文内容思维导图: 消息...

阿里云官方博客
8分钟前
0
0
如何在Chrome浏览器中启动deviceready事件(尝试调试phonegap项目)?

我正在开发PhoneGap应用程序,我希望能够在Chrome中调试它,而不是在电话上调试。但是,我在onGetReady()函数中初始化我的代码,该函数在PhoneGap触发“deviceready”事件时触发。由于Chr...

kisshua
今天
9
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
今天
13
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
今天
8
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部