swig-c/c++與高階指令碼語言之間的膠水工具
阿新 • • 發佈:2018-11-04
SWIG是c/c++與高階指令碼語言之間的膠水工具。
一個簡單的例子
http://www.swig.org/tutorial.html
c語言程式碼
/* File : example.c */ #include <time.h> double My_variable = 3.0; int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } int my_mod(int x, int y) { return (x%y); } char *get_time() { time_t ltime; time(<ime); return ctime(<ime); }
介面檔案
/* example.i */ %module example %{ /* Put header files here or function declarations like below */ extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time(); %} extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time();
生成Python模組
unix % swig -python example.i
unix % gcc -c example.c example_wrap.c -I/usr/local/include/python2.1
unix % ld -shared example.o example_wrap.o -o _example.so
驗證Python模組
>>> import example >>> example.fact(5) 120 >>> example.my_mod(7,3) 1 >>> example.get_time() 'Sun Feb 11 23:01:07 1996'
https://blog.csdn.net/tobacco5648/article/details/23999755
利用ctypes可以方便地呼叫本地的動態連結庫dll,但是C中的“指標的指標”很難表示。
如果dll中有以下函式:
- int test(void** p)
- {
- if(p == NULL)
- return -1;
- void* a = *p;
- if(a == NULL)
- return -2;
- int* b = ( int*)a;
- return *b;
- }
在python中對其進行不用的測試:
- test( None)
- return : -1
- -------------------------------------------
- a = c_void_p( None)
- b = pointer(a)
- test(b)
- return : -2
- -------------------------------------------
- a = c_int( 13)
- b = pointer(a)
- c = pointer(b)
- test(c)
- return : 13
則void**的表示方法顯而易見。