SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs.

1.  The SWIG %module directive specifies the name of the Python module
    --this module consists of a Python source file example.py and a low-level extension module _example.so.

2.  input is a interface file (*.i) or C/C++ header file,SWIG transforms it into a set of low-level procedural wrappers
     (module_wrap.cxx, which later compiled to be _module.so)
     Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class, in moudle.py)
     that is, file.i is transformed into a file file_wrap.c or file_wrap.cxx ; generate proxy class files in the target language

3.  Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG.
     (the included staff are need to compile module_wrap.cxx)

4.  %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable.(vars with const decorator)

5.  To create a constant, use #define, enum , or the %constant directive

6.  Global functions are wrapped as new Python built-in functions.

7.  SWIG creates a special object called `cvar' that is added to each SWIG generated module.
     Global variables are then accessed as attributes of this object.

8.   Most of SWIG's operation is controlled by special directives that are always preceded by a "%"
     to distinguish them from normal C declarations

9.  all variable declarations, regardless of any use of const, are wrapped as global variables.
     If a declaration happens to be declared as const, it is wrapped as a read-only variable

10. It'a a bad idea to pass a string from scripting language to C char * (of which the value is possible to be changed),
      for in python, string is a tuple (const!!)

11. except the basic types, For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :
      Everything else is a pointer

12. Arrays are fully supported by SWIG, but we need to create extra helper function

13. director feature can used to realize polymorphism

14. the code inside an %inline %{... %} block is given to both the C compiler and SWIG

Exmaple:

// file:llist.h
class llist
{
public:
int getvalue();
void setvalue(int a);
int value;
}; class llistA:public llist
{
public:
void printt(llist a);
void printt(llist* a);
}; struct Vector {
int a;
};
/* file: example.h */
#define MAXAA 6
int Foo;
char * path = "hello";
int fact(int n);
double cal(double X);
#include "llist.h"
#include "example.h"
#include <iostream>
using namespace std; int fact(int n)
{
if (n < ) return ;
if (n == ) return ;
else return n* fact(n-);
} double cal(double x)
{
Foo += (int)x * MAXAA;
return x *;
}; void strprint(const char * s, int a)
{
cout << s << " with int value: " << a << endl;
} llist getlist(Vector &vecta, llist * b)
{
b->setvalue(vecta.a+b->getvalue());
return *b;
} int llist::getvalue() { return this->value;}
void llist::setvalue(int a) { this->value = a;}
void llistA::printt(llist a) { cout << "llistA a" << endl;}
void llistA::printt(llist* a) { cout << " pointer of llistA a " << endl;}
// file :  example.i

%module example
%{
// the following macro will insert module init code in moudle_wrap.cxx
#define SWIG_FILE_WITH_INIT #include "llist.h" extern int Foo;
extern char * path; int fact(int n);
double cal(double X);
void strprint(const char *, int a);
llist getlist(Vector& vecta, llist * b);
%} extern int Foo;
%immutable;
extern char * path;
%mutable;
%constant const char * brig = "/usr/local"; class llist
{
public:
int getvalue();
void setvalue(int a);
int value;
}; class llistA:public llist
{
public:
void printt(llist a);
void printt(llist* a);
}; class Vector {
int a;
}; int fact(int n);
double cal(double X);
void strprint(const char *, int a);
llist getlist(Vector& vecta, llist * b);

to build it (bash):

#------------------C------------------------------
#swig -python example.i
#python setup.py build_ext --inplace
#
#----------------C++----------------------------
swig -c++ -python example.i
g++ -O2 -fPIC -c example.cpp
g++ -O2 -fPIC -c example_wrap.cxx -I/usr/include/python3.5m
g++ -shared example.o example_wrap.o -o _example.so

test code:

#!/usr/bin/env python
import example
print("call function fact: ", example.fact(5))
print("call function cal : ", example.cal(4.5))
print("print global value: ", example.cvar.Foo)
example.cvar.Foo = 6;
example.cal(1)
print("print global value Foo : ", example.cvar.Foo)
print("print global value path: ", example.cvar.path)
print(example.cvar.brig)
#print(example.cvar.MAXAA)
# be careful, it's "vetor()" not "vector"
v = example.Vector()
v.a = 5;
list = example.llist()
list.value = 6
lista = example.llistA()
lista.setvalue(8)
print("call member fuction of llistA")
lista.printt(list)
lista.printt(lista)
print("vector v : ", v)
print("class list : ", list)
print("class listA : ", lista)
listc = example.getlist(v, list)
print("instnce listc : ", listc)
print("value of listc: ", listc.getvalue())

use Swig to create C/C++ extension for Python的更多相关文章

  1. How to Create an PostgreSQL Extension

    转自:https://severalnines.com/blog/creating-new-modules-using-postgresql-create-extension Extensibilit ...

  2. [Tools] Create a Chrome Extension

    Creating a Chrome extension requires a manifest.json file which defines how your extension will beha ...

  3. How to create PDF files in a Python/Django application using ReportLab

    https://assist-software.net/blog/how-create-pdf-files-python-django-application-using-reportlab CONT ...

  4. [Python] Create a minimal website in Python using the Flask Microframework

    How to install Flask Use Flask to create a minimal website Build routes in Flask to respond to websi ...

  5. [Python] Create Unique Unordered Collections in Python with Set

    A set is an unordered collection with no duplicate items in Python. In this lesson, you will learn h ...

  6. [Python] Create a Log for your Python application

    Print statements will get you a long way in monitoring the behavior of your application, but logging ...

  7. python pip使用报错: Fatal error in launcher: Unable to create process using '"c:\python27\python.exe" "C:\Python27\Scripts\pip.exe" '

    在一个系统中,如果同时存在python2和python3,在cmd.exe程序下执行pip.pip2或者pip3均会报错. 如何解决: 如果是在python3环境下,使用pip安装扩展库,可以使用以下 ...

  8. SWIG 3 中文手册——9. SWIG 库

    目录 9 SWIG 库 9.1 %include 指令与库搜索路径 9.2 C 数组与指针 9.2.1 cpointer.i 9.2.2 carrays.i 9.2.3 cmalloc.i 9.2.4 ...

  9. Call Directory Extension 初探

    推荐序 本文介绍了 iOS 10 中的 Call Directory Extension 特性,并且最终 Demo 出一个来电黑名单的 App. 作者:余龙泽,哈工大软件工程大四学生,之前在美图公司实 ...

随机推荐

  1. python --github 刷题

    第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? import r ...

  2. springBoot中的定时任务

    springBoot中的定时任务 1:在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置 2:新建ScheduledTasks任务类 : package c ...

  3. java.io.OutputStream & java.io.FileOutputStream

    java.io.OutputStream & java.io.FileOutputStream 1.Java.io.OutputStream(字节输出流) 字节输出流,这是一个抽象类,是表示输 ...

  4. select实现简单TCP通信(ubuntu 18.04)

    一.服务器程序(server.c) #include <stdio.h> #include <unistd.h> #include <stdlib.h> #incl ...

  5. [译]Managing Vue.js State with Vuex

    原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...

  6. 数据库设计理论与实践·<四>数据库基本术语及其概念

    一.关系模型 关系模型是最重要的一种数据模型.关系数据库模型系统采用关系模型作为数据的组织方式. 关系模型的数据结构: 关系:一张表 元组:一行记录. 属性:一列 [码(键,key)]:表中的某个属性 ...

  7. Simple Recurrent Unit,单循环单元

    SRU(Simple Recurrent Unit),单循环单元 src/nnet/nnet-recurrent.h 使用Tanh作为非线性单元 SRU不保留内部状态 训练时,每个训练序列以零向量开始 ...

  8. java 基础 字符类型

    1.char类型的字面量可以是一个英文字母.字符或一个汉字,并且由单引号包括. 2.Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值. unicode: 1.un ...

  9. java导出csv文件使用Excel打开乱码问题

    写一个csv文件,发现使用 notpad++ 打开是没有问题的,但是使用 Excel 打开之后显示乱码 刚开始的代码是这样子的: ByteArrayOutputStream os = new Byte ...

  10. Django REST Framework API Guide 01

    之前按照REST Framework官方文档提供的简介写了一系列的简单的介绍博客,说白了就是翻译了一下简介,而且翻译的很烂.到真正的生产时,就会发现很鸡肋,连熟悉大概知道rest framework都 ...