use Swig to create C/C++ extension for Python
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的更多相关文章
- How to Create an PostgreSQL Extension
转自:https://severalnines.com/blog/creating-new-modules-using-postgresql-create-extension Extensibilit ...
- [Tools] Create a Chrome Extension
Creating a Chrome extension requires a manifest.json file which defines how your extension will beha ...
- 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 ...
- [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 ...
- [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 ...
- [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 ...
- 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安装扩展库,可以使用以下 ...
- 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 ...
- Call Directory Extension 初探
推荐序 本文介绍了 iOS 10 中的 Call Directory Extension 特性,并且最终 Demo 出一个来电黑名单的 App. 作者:余龙泽,哈工大软件工程大四学生,之前在美图公司实 ...
随机推荐
- SpringBoot常用注解使用
1.RequestBody和ResponseBody注解 @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 Controller的方法上,作为请求的映射地 ...
- 使用yield和send实现简单的协程函数
使用yield和send实现协程 协程的本质是在一个线程里实现多个任务之间的来回切换,我们使用yield和send可以实现简单的协程 def pro(): print(1) n = yield &qu ...
- Sqlserver远程过程调用失败
这种情况一般是由于有高版本的SqlServer导致的,网上有删除Loaldb之类的建议,这样其实不太好,回头用高版本数据库的话还得装回来.其实可以通过计算机管理->服务和应用程序进行设置,用下面 ...
- Excel复制粘贴假死
把打印机都删除了试一下. 如果还有问题,就把迅雷监听关掉.
- pyaudio
安装: 下载whl文件:https://github.com/intxcc/pyaudio_portaudio/releases 切换到whl文件目录,直接用pip安装 pip instal ...
- NoClassDefFoundError与ClassNOtFoundException的区别
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...
- python面向对象--类
1.类的概念:简单来说就是一组符合逻辑的参数或者是函数,一个种类.一个模型. 一个类中可以包含任意参数,并且可以定义任意个方法,但类并不是随意的将多个参数或者方法包含在class下,而是创建一个在事物 ...
- ng directive compile pre-link post-link
原文链接: http://www.jb51.net/article/58229.htm 1.ng在link之前编译所有的指令,然后link又分为 pre-link 与 post-link阶段compi ...
- CSL 的字符串(单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/551/D 题目大意: 题目描述 CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助. 给定 ...
- 小玩意--自定义log记录
之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...