blob: 738d937add76dfc5b7442e37128f669045897589 [file] [log] [blame]
Wenzel Jakob28f98aa2015-10-13 02:57:16 +02001About this project
2==================
3**pybind11** is a lightweight header library that exposes C++ types in Python
4and vice versa, mainly to create Python bindings of existing C++ code. Its
5goals and syntax are similar to the excellent `Boost.Python`_ library by David
6Abrahams: to minimize boilerplate code in traditional extension modules by
Wenzel Jakob93296692015-10-13 23:21:54 +02007inferring type information using compile-time introspection.
Wenzel Jakob28f98aa2015-10-13 02:57:16 +02008
9.. _Boost.Python: http://www.boost.org/doc/libs/release/libs/python/doc/index.html
10
11The main issue with Boost.Pythonand the reason for creating such a similar
12projectis Boost. Boost is an enormously large and complex suite of utility
13libraries that works with almost every C++ compiler in existence. This
14compatibility has its cost: arcane template tricks and workarounds are
15necessary to support the oldest and buggiest of compiler specimens. Now that
16C++11-compatible compilers are widely available, this heavy machinery has
17become an excessively large and unnecessary dependency.
18
19Think of this library as a tiny self-contained version of Boost.Python with
20everything stripped away that isn't relevant for binding generation. The whole
21codebase requires less than 3000 lines of code and only depends on Python (2.7
22or 3.x) and the C++ standard library. This compact implementation was possible
23thanks to some of the new C++11 language features (tuples, lambda functions and
Wenzel Jakob93296692015-10-13 23:21:54 +020024variadic templates). Since its creation, this library has grown beyond
25Boost.Python in many ways, leading to dramatically simpler binding code in many
26common situations.
Wenzel Jakob28f98aa2015-10-13 02:57:16 +020027
28Core features
29*************
30The following core C++ features can be mapped to Python
31
32- Functions accepting and returning custom data structures per value, reference, or pointer
33- Instance methods and static methods
34- Overloaded functions
35- Instance attributes and static attributes
36- Exceptions
37- Enumerations
38- Callbacks
39- Custom operators
40- STL data structures
41- Smart pointers with reference counting like ``std::shared_ptr``
42- Internal references with correct reference counting
43- C++ classes with virtual (and pure virtual) methods can be extended in Python
44
45Goodies
46*******
47In addition to the core functionality, pybind11 provides some extra goodies:
48
49- It is possible to bind C++11 lambda functions with captured variables. The
50 lambda capture data is stored inside the resulting Python function object.
51
52- pybind11 uses C++11 move constructors and move assignment operators whenever
53 possible to efficiently transfer custom data types.
54
55- It's easy to expose the internal storage of custom data types through
56 Pythons' buffer protocols. This is handy e.g. for fast conversion between
57 C++ matrix classes like Eigen and NumPy without expensive copy operations.
58
59- pybind11 can automatically vectorize functions so that they are transparently
60 applied to all entries of one or more NumPy array arguments.
61
62- Python's slice-based access and assignment operations can be supported with
63 just a few lines of code.
64