This is a quick walk through of how to take c++ and run it with Python through bindings. If you find yourself wishing to learn more on the topic, Swig’s website for working with Python is a good start. My experience in setting this up was far more tedious than it had to be and I hope this will save people some time. As a note, I currently work on Ubuntu 16.04 and Python 2.7; this will be tailored to those dependencies, however, I do not believe any major changes will be required to the setup.py file based on Swig’s website and a StackOverflow question for Python 3. In addition, the majority of operating systems should be covered by this walk through, with minor tweaks such as yum instead of apt-get for select operating systems.
1. Install
# python-dev
sudo apt-get install python-dev # python2.x
sudo apt-get install python3-dev # python3.x
# swig
sudo apt-get install swig
2. Source
c++ Fibonacci implementation, filename: fib.cpp
#include "fib.h"
int fibonacci(int n) {
if(n <= 1) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
c++ fibonacci header file, filename: fib.h. I’m going to explain why this file exists in a moment.
int fibonacci(int n);
The next file is the interface file for swig, fib.i. This is telling swig what bindings it will need to create and is why we implemented fib.h.
%module Fibonacci
%{
#include "fib.h"
%}
%include "fib.h"
The alternative to creating the fib.h file is directly below. For this we define each function individually for swig to then bind.
%module Fibonacci
%{
int fibonacci(int n);
%}
int fibonacci(int n);
3. Build
setup.py
, this file is taken directly from Swig’s documentation and modified slightly.
#!/usr/bin/env python
from distutils.core import setup, Extension
fib_module = Extension(
'_Fibonacci',
sources=['fib_wrap.cxx', 'fib.cpp'],
# fib_wrap.cxx is going to be generated by swig
)
setup (
name = 'Fibonacci',
version = '0.0',
author = "YOUR_NAME",
description = "Fibonacci swig",
ext_modules = [fib_module],
py_modules = ["Fibonacci"], # name of module that we're going import
)
build.sh
or whatever you fancy.
#!/bin/bash
swig -c++ -python fib.i
python setup.py build_ext --inplace
4. Run
Assign permissions (e.g. chmod 755 build.sh
) and run ./build.sh
. From there you can go into the python console and test by running the following:
$ python
>>> import Fibonacci
>>> Fibonacci.fibonacci(10)
55
5. Conclusion
Please let me know if anything here can be improved so I can update this for future readers. Regardless, I hope this helped some of you with your projects/work and saved you some time.