Home  >  Article  >  Backend Development  >  Wrapping C/C++ into Python using SWIG

Wrapping C/C++ into Python using SWIG

王林
王林forward
2023-08-25 20:25:101265browse

Wrapping C/C++ into Python using SWIG

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.

  • Manual Wrapping
  • Use Pyrex to wrap C code.
  • Ctypes
  • SIP
  • Boost 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.

Installation

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#.

My c file is example.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);
   }
}

Interface file:

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,

example.i

/* File: example.i */
%module example
%{
   #define SWIG_FILE_WITH_INIT
   #include "example.h"
%}
%include "example.h"

Header file

We have included the header file in the previous example file. This is my header file :

example.h

int fact(int n);

Installation file:

from distutils.core import setup, Extension
example_module = Extension(&#39;_example&#39;,
   sources=[&#39;example_wrap.c&#39;, &#39;example.c&#39;],
)
setup (name = &#39;example&#39;,
   version = &#39;0.1&#39;,
   author = "SWIG Docs",
   description = """Simple swig example from docs""",
   ext_modules = [example_module],
   py_modules = ["example"],
)

Create wrapper

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

&ldquo;Your_File_Name&rdquo; + &ldquo;_wrapper&rdquo; + &ldquo;Your_language_extension&rdquo;

So if your example file is test.c , then your wrapper file will be "test_wrapper.c".

Build extension

>python setup.py build_ext
running build_ext
building &#39;_example&#39; extension
creating build
creating build\temp.win32-3.6
creating build\temp.win32-3.6\Release
&hellip;.

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 &#39;c:\python\python361&#39;
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!

Statement:
This article is reproduced at:tutorialspoint.com. If there is any infringement, please contact admin@php.cn delete