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

Wrapping C/C++ into Python using SWIG

王林
Release: 2023-08-25 20:25:10
forward
1342 people have browsed it

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);
   }
}
Copy after login

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"
Copy after login

Header file

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

example.h

int fact(int n);
Copy after login

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"],
)
Copy after login

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
Copy after login

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;
Copy after login

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;.
Copy after login

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
Copy after login

That’s it, now import the function from the file and run it.

>>> from example import fact
>>> fact(6)
720
Copy after login

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!

Related labels:
source:tutorialspoint.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template