swig is not a Python module. Instead it interfaces C/C++ to other languages. We are obviously interested in extending Python by some C code. Below you find a complete example including a function calculating the factorial and two functions mirroring a string.
The interface:
/* File : example.i */ %module example %include <cstring.i> %cstring_bounded_output(char* outstr, 1024); %{ /* Put headers and other declarations here */ extern int fact(int); extern char *mirroredText( char *, int *OUTPUT); extern int mirroredTextV2( char *, char *outstr); %} extern int fact(int); extern char *mirroredText( char *, int *OUTPUT); extern int mirroredTextV2( char *, char *outstr);
The c-code:
/* File : example.c */ #include <string.h> #include <stdio.h> /* Compute factorial of n */ int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } char *mirroredText( char *inString, int *argout) { static char buffer[ 80]; strcpy( buffer, inString); strcat( buffer, "_mirrored"); *argout = strlen( buffer); return buffer; } int mirroredTextV2( char *inString, char *argout) { strcpy( argout, inString); strcat( argout, "_mirroredV2"); return strlen( argout); }
Two scripts to make it for Python2 and Python3.
Do2.sh:
#!/usr/bin/env bash echo "swig -python example.i" swig -python example.i echo "gcc -c -fpic example.c" gcc -c -fpic example.c example_wrap.c -I/usr/include/python2.7 echo "gcc -shared -o _example.so" gcc -shared example.o example_wrap.o -o _example.so echo "executing 'python xmplTest.py'" python xmplTest.py
Do3.sh:
#!/usr/bin/env bash echo "swig -python example.i" swig -python example.i echo "gcc -c -fpic example.c" gcc -c -fpic example.c example_wrap.c -I/usr/include/python3.5 echo "gcc -shared -o _example.so" gcc -shared example.o example_wrap.o -o _example.so echo "executing 'python3 xmplTest.py'" python3 xmplTest.py
The Python script that tests the code:
#!/usr/bin/env python """ this script performs tests for example.c Depending on whether the .so has been made with Do2.sh or Do3.sh this script is launched by: python xmplTest.py or python3 xmplTest.py """ import example import sys def main(): print( "\n--- xmplTest.py") print( "Python version: %s" % repr(sys.version)) i = 4 ret = example.fact( i) print( "fact(%d) = %d" % (i, ret)) if ret == 24: print( "OK") else: print( "bad result: %s" % repr( ret)) t = "hello" ret = example.mirroredText( t) print( "mirroredText( '%s'): %s" % ( t, repr( ret))) if ret[0] == 'hello_mirrored' and ret[1] == 14: print( "OK") else: print( "bad result: %s" % repr( ret)) ret = example.mirroredTextV2( t) print( "mirroredTextV2( '%s'): %s" % (t, repr( ret))) if ret[1] == 'hello_mirroredV2' and ret[0] == 16: print( "OK") else: print( "bad result: %s" % repr( ret)) if __name__ == '__main__': main()