Talk on integrating native C++ sensibly into Python for ease of use of the code base. Inheriting from C++ classes, overriding functionality, automatically generating the bindings using Py++ and SCons.
Code demonstrated in the presentation can be found here:
http://www.kloss-familie.de/moin/TalksPresentations
What's New in Teams Calling, Meetings and Devices March 2024
Thinking Hybrid - Python/C++ Integration
1. Python Extending/Integrating A Real World Example Tips Summary
Python where we can,
C++ where we must
Source: http://xkcd.com/353/
Guy K. Kloss — Python where we can,C++ where we must 1/28
2. Python Extending/Integrating A Real World Example Tips Summary
Python where we can,
C++ where we must∗
Guy K. Kloss
BarCamp Auckland 2007
15 December 2007
∗ Quote: Alex Martelli, Senior Google Developer
Guy K. Kloss — Python where we can,C++ where we must 2/28
3. Python Extending/Integrating A Real World Example Tips Summary
Outline
1 Python
2 Extending/Integrating
3 A Real World Example
4 Tips
Guy K. Kloss — Python where we can,C++ where we must 3/28
4. Python Extending/Integrating A Real World Example Tips Summary
Outline
1 Python
2 Extending/Integrating
3 A Real World Example
4 Tips
Guy K. Kloss — Python where we can,C++ where we must 4/28
5. Python Extending/Integrating A Real World Example Tips Summary
What is Python?
Object–oriented
Dynamic
Easy to learn syntax
High-level data types
Scripting language
Embeddable in C/C++
Guy K. Kloss — Python where we can,C++ where we must 5/28
6. Python Extending/Integrating A Real World Example Tips Summary
Python vs. Java (or C++)
No compilation
Fast edit–build–debug cycle
Dynamic Typing
No need to declare variables for use
Easy Syntax
No curly braces, no semicolons, no new . . .
Embeddable
Scripting support for your applications
Interactive
Create, view, change objects at runtime
50% less code
Compact and natural syntax
300% more productive
Closer to the way you think
Guy K. Kloss — Python where we can,C++ where we must 6/28
7. Python Extending/Integrating A Real World Example Tips Summary
Why Python?
Mixable
Extend Python with components
written in C++, Java, C
Embed Python into your application
and call it from C/C++
Platform independent
Powerful
Ease of use of scripting language
Built-in object types
Extensive libraries
Automatic memory management
Modules, classes and exceptions
Guy K. Kloss — Python where we can,C++ where we must 7/28
8. Python Extending/Integrating A Real World Example Tips Summary
What is Python used for?
System Utilities
System admin tools, portable shell scripts
Internet Scripting
CGI scripts, parse HTML, process XML, email tools
User Interfaces (UIs) & rapid prototyping
Component Glue
Scripting for apps, COM scripting
Distributed Programming
Web Services, COM, CORBA, XML–RPC
Database Programming
Scientific Computing
PyODE, NumPy, SciPy, PyMol, . . .
Image Processing
Python Image Library
OpenGL Programming, Writing Games
PyOpenGL, Panda3D, PyOgre, Py3d, VisualPython
Artifical Intelligence
Guy K. Kloss — Python where we can,C++ where we must 8/28
9. Python Extending/Integrating A Real World Example Tips Summary
Why Native Code?
C/C++, Fortran (and Java, C#, ...)
Performance
Binding to legacy code
(Existing) Applications/Libraries . . .
... want to be scripted
... want to be tested
... want to be re-used
Guy K. Kloss — Python where we can,C++ where we must 9/28
10. Python Extending/Integrating A Real World Example Tips Summary
Outline
1 Python
2 Extending/Integrating
3 A Real World Example
4 Tips
Guy K. Kloss — Python where we can,C++ where we must 10/28
11. Python Extending/Integrating A Real World Example Tips Summary
What if I could . . .
Use this code more effectively . . . ?
[NaSt2D demonstration (native executable)]
Guy K. Kloss — Python where we can,C++ where we must 11/28
12. Python Extending/Integrating A Real World Example Tips Summary
Extending/Integration
The Contestants:
The “classic way” . . .
Extending and Embedding the Python Interpreter
The “new way” . . .
Python ctypes
SWIG
Boost.Python
Others:
SIP
Pythonizer
SILOON
(Pyrex)
Extensions also for Java, C#, Fortran, . . . available
Guy K. Kloss — Python where we can,C++ where we must 12/28
13. Python Extending/Integrating A Real World Example Tips Summary
Extending/Integration
The Contestants:
The “classic way” . . .
Extending and Embedding the Python Interpreter
The “new way” . . .
Python ctypes
SWIG
Boost.Python
Others:
SIP
Pythonizer
SILOON
(Pyrex)
Extensions also for Java, C#, Fortran, . . . available
Guy K. Kloss — Python where we can,C++ where we must 12/28
14. Python Extending/Integrating A Real World Example Tips Summary
Extending/Integration
The Contestants:
The “classic way” . . .
Extending and Embedding the Python Interpreter
The “new way” . . .
Python ctypes
SWIG
Boost.Python
Others:
SIP
Pythonizer
SILOON
(Pyrex)
Extensions also for Java, C#, Fortran, . . . available
Guy K. Kloss — Python where we can,C++ where we must 12/28
15. Python Extending/Integrating A Real World Example Tips Summary
Extending/Integration
The Contestants:
The “classic way” . . .
Extending and Embedding the Python Interpreter
The “new way” . . .
Python ctypes
SWIG
Boost.Python
Others:
SIP
Pythonizer
SILOON
(Pyrex)
Extensions also for Java, C#, Fortran, . . . available
Guy K. Kloss — Python where we can,C++ where we must 12/28
16. Python Extending/Integrating A Real World Example Tips Summary
Extending/Integration
The Contestants:
The “classic way” . . .
Extending and Embedding the Python Interpreter
The “new way” . . .
Python ctypes
SWIG
Boost.Python
Others:
SIP
Pythonizer
SILOON
(Pyrex)
Extensions also for Java, C#, Fortran, . . . available
Guy K. Kloss — Python where we can,C++ where we must 12/28
17. Python Extending/Integrating A Real World Example Tips Summary
Boost.Python
Thinking Hybrid with Boost.Python
Bottom up and . . .
Top down possible
Develop quickly
Resolve bottle necks
Donald Knuth’s:
“Premature optimisation is the root of all evil.”
or: Don’t Optimise Now!
Guy K. Kloss — Python where we can,C++ where we must 13/28
18. Python Extending/Integrating A Real World Example Tips Summary
Boost.Python
Thinking Hybrid with Boost.Python
Bottom up and . . .
Top down possible
Develop quickly
Resolve bottle necks
Donald Knuth’s:
“Premature optimisation is the root of all evil.”
or: Don’t Optimise Now!
Guy K. Kloss — Python where we can,C++ where we must 13/28
19. Python Extending/Integrating A Real World Example Tips Summary
Boost.Python
Thinking Hybrid with Boost.Python
Bottom up and . . .
Top down possible
Develop quickly
Resolve bottle necks
Donald Knuth’s:
“Premature optimisation is the root of all evil.”
or: Don’t Optimise Now!
Guy K. Kloss — Python where we can,C++ where we must 13/28
20. Python Extending/Integrating A Real World Example Tips Summary
Hello World
char const* greet(unsigned x) {
static char const* const msgs[] = {quot;helloquot;, quot;Boost.Pythonquot;,
quot;world!quot;};
if (x > 2) {
throw std::range error(quot;greet: Index out of range.quot;);
}
return msgs[x];
}
#include <boost/python.hpp>
using namespace boost::python;
BOOST PYTHON MODULE(hello)
{
.def(quot;greetquot;, greet, quot;return one of 3 parts of a greetingquot;);
}
And here it is in action:
>>> import hello
>>> for x in range(3):
... print hello.greet(x)
...
hello
Boost.Python
world!
Guy K. Kloss — Python where we can,C++ where we must 14/28
21. Python Extending/Integrating A Real World Example Tips Summary
Boost.Python
One of a few libraries that make it easy
to integrate C++ and Python code
How does it pull off this trick?
Template meta–programming
(i. e. Don’t ask!)
Guy K. Kloss — Python where we can,C++ where we must 15/28
22. Python Extending/Integrating A Real World Example Tips Summary
Boost.Python
One of a few libraries that make it easy
to integrate C++ and Python code
How does it pull off this trick?
Template meta–programming
(i. e. Don’t ask!)
Guy K. Kloss — Python where we can,C++ where we must 15/28
23. Python Extending/Integrating A Real World Example Tips Summary
See it Happen
I’m making it work for you now . . .
[“MyClass” demonstration (MyClass.cpp, MyClass.h, mymodule.cpp)]
Guy K. Kloss — Python where we can,C++ where we must 16/28
24. Python Extending/Integrating A Real World Example Tips Summary
Outline
1 Python
2 Extending/Integrating
3 A Real World Example
4 Tips
Guy K. Kloss — Python where we can,C++ where we must 17/28
25. Python Extending/Integrating A Real World Example Tips Summary
A Real World Example
Re-visiting NaSt2D
Wrapping NaSt2D
Control the code
Guy K. Kloss — Python where we can,C++ where we must 18/28
26. Python Extending/Integrating A Real World Example Tips Summary
NaSt2D in Python
This is what I’m going to show you:
Code to be wrapped
Generated wrapper code
Generator script
SCons (build system)
How it works with Python
[Wrapped NaSt2D demonstration (Wrapper.h, nast2dmodule.cpp,
generate bindings.py, SConstruct, demo0.py)]
Guy K. Kloss — Python where we can,C++ where we must 19/28
27. Python Extending/Integrating A Real World Example Tips Summary
Extend Wrapper Class
Inheriting from C++ classes
Interfacing numerical values
Change functionality
Follow the Computation
Guy K. Kloss — Python where we can,C++ where we must 20/28
28. Python Extending/Integrating A Real World Example Tips Summary
Overriding in Python
This is what I’m going to show you:
Overriding a native method in Python
Native method needs to be “virtual”
Live data plotting with GNUplot
[NaSt2D with plotting demonstration (demo1.py, demo2.py)]
Guy K. Kloss — Python where we can,C++ where we must 21/28
29. Python Extending/Integrating A Real World Example Tips Summary
Do more Computations
Parameter Study
Change input file
Compute several cases
Plot results automatically
Guy K. Kloss — Python where we can,C++ where we must 22/28
30. Python Extending/Integrating A Real World Example Tips Summary
Automating in Python
This is what I’m going to show you:
Using a template input file
Batch–calculating several runs
Plotting results with GNUplot
[NaSt2D with parameter variation demonstration (demo3.py, demo4.py)]
Guy K. Kloss — Python where we can,C++ where we must 23/28
31. Python Extending/Integrating A Real World Example Tips Summary
Outline
1 Python
2 Extending/Integrating
3 A Real World Example
4 Tips
Guy K. Kloss — Python where we can,C++ where we must 24/28
32. Python Extending/Integrating A Real World Example Tips Summary
Tips
To override C++ methods: make them virtual
C/C++ pit fall
Call by reference/value
Solution: calling policies
Map to “other/sane” languages
Java: Jython
C#: IronPython
Fortran: PyFort, Py2F
(Native to other: SWIG)
Guy K. Kloss — Python where we can,C++ where we must 25/28
33. Python Extending/Integrating A Real World Example Tips Summary
Summary
Why is Python good for you?
How can performance bottle necks be resolved?
Advantages of “Thinking Hybrid”
Python–native wrapping using Boost.Python
Automated wrapper generation
SCons build system
Guy K. Kloss — Python where we can,C++ where we must 26/28
34. Python Extending/Integrating A Real World Example Tips Summary
Python and the “Need for Speed”
Cuong Do – Software Architect YouTube.com
“Python is fast enough for our site
and allows us to produce maintainable features
in record times,
with a minimum of developers.”
Guy K. Kloss — Python where we can,C++ where we must 27/28
35. Python Extending/Integrating A Real World Example Tips Summary
Questions?
G.Kloss@massey.ac.nz
Guy K. Kloss — Python where we can,C++ where we must 28/28