You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							280 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							280 lines
						
					
					
						
							11 KiB
						
					
					
				
								.. _basics:
							 | 
						|
								
							 | 
						|
								First steps
							 | 
						|
								###########
							 | 
						|
								
							 | 
						|
								This sections demonstrates the basic features of pybind11. Before getting
							 | 
						|
								started, make sure that development environment is set up to compile the
							 | 
						|
								included set of examples, which also double as test cases.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								Compiling the test cases
							 | 
						|
								========================
							 | 
						|
								
							 | 
						|
								Linux/MacOS
							 | 
						|
								-----------
							 | 
						|
								
							 | 
						|
								On Linux  you'll need to install the **python-dev** or **python3-dev** packages as
							 | 
						|
								well as **cmake**. On Mac OS, the included python version works out of the box,
							 | 
						|
								but **cmake** must still be installed.
							 | 
						|
								
							 | 
						|
								After installing the prerequisites, run
							 | 
						|
								
							 | 
						|
								.. code-block:: bash
							 | 
						|
								
							 | 
						|
								   cmake .
							 | 
						|
								   make -j 4
							 | 
						|
								
							 | 
						|
								followed by
							 | 
						|
								
							 | 
						|
								.. code-block:: bash
							 | 
						|
								
							 | 
						|
								   make test
							 | 
						|
								
							 | 
						|
								Windows
							 | 
						|
								-------
							 | 
						|
								
							 | 
						|
								On Windows, use the `CMake GUI`_ to create a Visual Studio project. Note that
							 | 
						|
								only the 2015 release and newer versions are supported since pybind11 relies on
							 | 
						|
								various C++11 language features that break older versions of Visual Studio.
							 | 
						|
								After running CMake, open the created :file:`pybind11.sln` file and perform a
							 | 
						|
								release build, which will will produce a file named
							 | 
						|
								:file:`Release\\example.pyd`. Copy this file to the :file:`example` directory
							 | 
						|
								and run :file:`example\\run_test.py` using the targeted Python version.
							 | 
						|
								
							 | 
						|
								.. _`CMake GUI`: https://cmake.org/runningcmake
							 | 
						|
								
							 | 
						|
								.. Note::
							 | 
						|
								
							 | 
						|
								    When all tests fail, make sure that
							 | 
						|
								
							 | 
						|
								    1. The Python binary and the testcases are compiled for the same processor
							 | 
						|
								       type and bitness (i.e. either **i386** or **x86_64**)
							 | 
						|
								
							 | 
						|
								    2. The Python binary used to run :file:`example\\run_test.py` matches the
							 | 
						|
								       Python version specified in the CMake GUI. This is controlled via
							 | 
						|
								       the ``PYTHON_EXECUTABLE`` ``PYTHON_INCLUDE_DIR``, and
							 | 
						|
								       ``PYTHON_LIBRARY`` variables.
							 | 
						|
								
							 | 
						|
								.. seealso::
							 | 
						|
								
							 | 
						|
								    Advanced users who are already familiar with Boost.Python may want to skip
							 | 
						|
								    the tutorial and look at the test cases in the :file:`example` directory,
							 | 
						|
								    which exercise all features of pybind11.
							 | 
						|
								
							 | 
						|
								Creating bindings for a simple function
							 | 
						|
								=======================================
							 | 
						|
								
							 | 
						|
								Let's start by creating Python bindings for an extremely simple function, which
							 | 
						|
								adds two numbers and returns their result:
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    int add(int i, int j) {
							 | 
						|
								        return i + j;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								For simplicity [#f1]_, we'll put both this function and the binding code into
							 | 
						|
								a file named :file:`example.cpp` with the following contents:
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    #include <pybind11/pybind11.h>
							 | 
						|
								
							 | 
						|
								    int add(int i, int j) {
							 | 
						|
								        return i + j;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    namespace py = pybind11;
							 | 
						|
								
							 | 
						|
								    PYBIND11_PLUGIN(example) {
							 | 
						|
								        py::module m("example", "pybind11 example plugin");
							 | 
						|
								
							 | 
						|
								        m.def("add", &add, "A function which adds two numbers");
							 | 
						|
								
							 | 
						|
								        return m.ptr();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								The :func:`PYBIND11_PLUGIN` macro creates a function that will be called when an
							 | 
						|
								``import`` statement is issued from within Python. The next line creates a
							 | 
						|
								module named ``example`` (with the supplied docstring). The method
							 | 
						|
								:func:`module::def` generates binding code that exposes the
							 | 
						|
								``add()`` function to Python. The last line returns the internal Python object
							 | 
						|
								associated with ``m`` to the Python interpreter.
							 | 
						|
								
							 | 
						|
								.. note::
							 | 
						|
								
							 | 
						|
								    Notice how little code was needed to expose our function to Python: all
							 | 
						|
								    details regarding the function's parameters and return value were
							 | 
						|
								    automatically inferred using template metaprogramming. This overall
							 | 
						|
								    approach and the used syntax are borrowed from Boost.Python, though the
							 | 
						|
								    underlying implementation is very different.
							 | 
						|
								
							 | 
						|
								pybind11 is a header-only-library, hence it is not necessary to link against
							 | 
						|
								any special libraries (other than Python itself). On Windows, use the CMake
							 | 
						|
								build file discussed in section :ref:`cmake`. On Linux and Mac OS, the above
							 | 
						|
								example can be compiled using the following command
							 | 
						|
								
							 | 
						|
								.. code-block:: bash
							 | 
						|
								
							 | 
						|
								    $ c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags --libs` example.cpp -o example.so
							 | 
						|
								
							 | 
						|
								In general, it is advisable to include several additional build parameters
							 | 
						|
								that can considerably reduce the size of the created binary. Refer to section
							 | 
						|
								:ref:`cmake` for a detailed example of a suitable cross-platform CMake-based
							 | 
						|
								build system.
							 | 
						|
								
							 | 
						|
								Assuming that the created file :file:`example.so` (:file:`example.pyd` on Windows)
							 | 
						|
								is located in the current directory, the following interactive Python session
							 | 
						|
								shows how to load and execute the example.
							 | 
						|
								
							 | 
						|
								.. code-block:: python
							 | 
						|
								
							 | 
						|
								    $ python
							 | 
						|
								    Python 2.7.10 (default, Aug 22 2015, 20:33:39)
							 | 
						|
								    [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin
							 | 
						|
								    Type "help", "copyright", "credits" or "license" for more information.
							 | 
						|
								    >>> import example
							 | 
						|
								    >>> example.add(1, 2)
							 | 
						|
								    3L
							 | 
						|
								    >>>
							 | 
						|
								
							 | 
						|
								.. _keyword_args:
							 | 
						|
								
							 | 
						|
								Keyword arguments
							 | 
						|
								=================
							 | 
						|
								
							 | 
						|
								With a simple modification code, it is possible to inform Python about the
							 | 
						|
								names of the arguments ("i" and "j" in this case).
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    m.def("add", &add, "A function which adds two numbers",
							 | 
						|
								          py::arg("i"), py::arg("j"));
							 | 
						|
								
							 | 
						|
								:class:`arg` is one of several special tag classes which can be used to pass
							 | 
						|
								metadata into :func:`module::def`. With this modified binding code, we can now
							 | 
						|
								call the function using keyword arguments, which is a more readable alternative
							 | 
						|
								particularly for functions taking many parameters:
							 | 
						|
								
							 | 
						|
								.. code-block:: python
							 | 
						|
								
							 | 
						|
								    >>> import example
							 | 
						|
								    >>> example.add(i=1, j=2)
							 | 
						|
								    3L
							 | 
						|
								
							 | 
						|
								The keyword names also appear in the function signatures within the documentation.
							 | 
						|
								
							 | 
						|
								.. code-block:: python
							 | 
						|
								
							 | 
						|
								    >>> help(example)
							 | 
						|
								
							 | 
						|
								    ....
							 | 
						|
								
							 | 
						|
								    FUNCTIONS
							 | 
						|
								        add(...)
							 | 
						|
								            Signature : (i: int, j: int) -> int
							 | 
						|
								
							 | 
						|
								            A function which adds two numbers
							 | 
						|
								
							 | 
						|
								.. _default_args:
							 | 
						|
								
							 | 
						|
								Default arguments
							 | 
						|
								=================
							 | 
						|
								
							 | 
						|
								Suppose now that the function to be bound has default arguments, e.g.:
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    int add(int i = 1, int j = 2) {
							 | 
						|
								        return i + j;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								Unfortunately, pybind11 cannot automatically extract these parameters, since they
							 | 
						|
								are not part of the function's type information. However, they are simple to specify
							 | 
						|
								using an extension of :class:`arg`:
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    m.def("add", &add, "A function which adds two numbers",
							 | 
						|
								          py::arg("i") = 1, py::arg("j") = 2);
							 | 
						|
								
							 | 
						|
								The default values also appear within the documentation.
							 | 
						|
								
							 | 
						|
								.. code-block:: python
							 | 
						|
								
							 | 
						|
								    >>> help(example)
							 | 
						|
								
							 | 
						|
								    ....
							 | 
						|
								
							 | 
						|
								    FUNCTIONS
							 | 
						|
								        add(...)
							 | 
						|
								            Signature : (i: int = 1, j: int = 2) -> int
							 | 
						|
								
							 | 
						|
								            A function which adds two numbers
							 | 
						|
								
							 | 
						|
								.. _supported_types:
							 | 
						|
								
							 | 
						|
								Supported data types
							 | 
						|
								====================
							 | 
						|
								
							 | 
						|
								The following basic data types are supported out of the box (some may require
							 | 
						|
								an additional extension header to be included). To pass other data structures
							 | 
						|
								as arguments and return values, refer to the section on binding :ref:`classes`.
							 | 
						|
								
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								|  Data type                 |  Description             | Header file           |
							 | 
						|
								+============================+==========================+=======================+
							 | 
						|
								| int8_t, uint8_t            | 8-bit integers           | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| int16_t, uint16_t          | 16-bit integers          | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| int32_t, uint32_t          | 32-bit integers          | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| int64_t, uint64_t          | 64-bit integers          | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| ssize_t, size_t            | Platform-dependent size  | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| float, double              | Floating point types     | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| bool                       | Two-state Boolean type   | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| char                       | Character literal        | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| wchar_t                    | Wide character literal   | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| const char *               | UTF-8 string literal     | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| const wchar_t *            | Wide string literal      | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::string                | STL dynamic UTF-8 string | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::wstring               | STL dynamic wide string  | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::pair<T1, T2>          | Pair of two custom types | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::tuple<....>           | Arbitrary tuple of types | pybind11/pybind11.h   |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::complex<T>            | Complex numbers          | pybind11/complex.h    |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::array<T, Size>        | STL static array         | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::vector<T>             | STL dynamic array        | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::list<T>               | STL linked list          | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::map<T1, T2>           | STL ordered map          | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::unordered_map<T1, T2> | STL unordered map        | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::set<T>                | STL ordered set          | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::unordered_set<T>      | STL unordered set        | pybind11/stl.h        |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								| std::function<...>         | STL polymorphic function | pybind11/functional.h |
							 | 
						|
								+----------------------------+--------------------------+-----------------------+
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								.. [#f1] In practice, implementation and binding code will generally be located
							 | 
						|
								         in separate files.
							 | 
						|
								
							 |