There are many ways to encapsulate existing C or C functionality in Python. In this section, we will see how to wrap C/C functionality using SWIG. Here are other options for wrapping C/C functionality in python.
SWIG (Simple Wrapper Interface Generator) is capable of working with many other languages including Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp (CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3, and OCAML. Swig also supports multiple interpreted and compiled Scheme implementations (such as Guile, MzScheme, Chicken).
But we will only discuss its implementation using python here.
SWIG is basically a macro language that understands C code and then spits out wrapper code for the language of your choice.
I am using the "swigwin-3.0.12" windows swig installer, you can download it from:
http://www.swig .org/download.html
Besides that, you may also need "Microsoft Visual Studio 14.0" or higher to run the swig program in Windows.
For explanation Using swig, let's say we have some c functions and we want to add them to other languages like Tcl, Perl, Python (I am interacting with python), Java and C#.
#include "example.h" int fact(int n) { if (n < 0) { /* This should probably return an error, but this is simpler */ return 0; } if (n == 0) { return 1; } else { /* testing for overflow would be a good idea here */ return n * fact(n-1); } }
Now, if you want to add c files to your preferred language, you need to write an "interface file" which is the input to SWIG. Mine The example.c interface file is,
/* File: example.i */ %module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} %include "example.h"
We have included the header file in the previous example file. This is my header file :
int fact(int n);
from distutils.core import setup, Extension example_module = Extension('_example', sources=['example_wrap.c', 'example.c'], ) setup (name = 'example', version = '0.1', author = "SWIG Docs", description = """Simple swig example from docs""", ext_modules = [example_module], py_modules = ["example"], )
Now we will create using our interface file (example.i) python wrapper. To create a wrapper for your function, just run the following command on the CLI.
>swig -python example.i
Now, if you see the current working directory, you have just created a new file. If you use the above filename as mine then your wrapper file will be "example_wrap.c" otherwise the wrapper file will be named like
“Your_File_Name” + “_wrapper” + “Your_language_extension”
So if your example file is test.c , then your wrapper file will be "test_wrapper.c".
>python setup.py build_ext running build_ext building '_example' extension creating build creating build\temp.win32-3.6 creating build\temp.win32-3.6\Release ….
That is, now we can encapsulate C language into Python language. To check it, you can run it directly or create a virtual environment and run it separately.
C:\Users\rajesh>mkdir swigExample && cd swigExample C:\Users\rajesh\swigExample>virtualenv swigenv Using base prefix 'c:\python\python361' New python executable in C:\Users\rajesh\swigExample\swigenv\Scripts\python.exe Installing setuptools, pip, wheel...done. C:\Users\rajesh\swigExample>.\swigenv\Scripts\activate (swigenv) C:\Users\rajesh\swigExample>python
That’s it, now import the function from the file and run it.
>>> from example import fact >>> fact(6) 720
The above is the detailed content of Wrapping C/C++ into Python using SWIG. For more information, please follow other related articles on the PHP Chinese website!