2016-03-09 20:11:19 +00:00
|
|
|
|
Frequently asked questions
|
|
|
|
|
##########################
|
|
|
|
|
|
2016-05-03 12:32:47 +00:00
|
|
|
|
"ImportError: dynamic module does not define init function"
|
|
|
|
|
===========================================================
|
2016-04-11 15:38:25 +00:00
|
|
|
|
|
2017-04-23 23:51:44 +00:00
|
|
|
|
You are likely using an incompatible version of Python (for instance, the
|
|
|
|
|
extension library was compiled against Python 2, while the interpreter is
|
|
|
|
|
running on top of some version of Python 3, or vice versa).
|
2016-05-03 12:32:47 +00:00
|
|
|
|
|
|
|
|
|
"Symbol not found: ``__Py_ZeroStruct`` / ``_PyInstanceMethod_Type``"
|
|
|
|
|
========================================================================
|
|
|
|
|
|
2017-04-23 23:51:44 +00:00
|
|
|
|
See the first answer.
|
2016-05-03 12:32:47 +00:00
|
|
|
|
|
2016-09-05 08:19:18 +00:00
|
|
|
|
"SystemError: dynamic module not initialized properly"
|
|
|
|
|
======================================================
|
|
|
|
|
|
2017-04-23 23:51:44 +00:00
|
|
|
|
See the first answer.
|
2016-09-05 08:19:18 +00:00
|
|
|
|
|
2016-05-03 12:32:47 +00:00
|
|
|
|
The Python interpreter immediately crashes when importing my module
|
|
|
|
|
===================================================================
|
|
|
|
|
|
2017-04-23 23:51:44 +00:00
|
|
|
|
See the first answer.
|
2016-04-11 15:38:25 +00:00
|
|
|
|
|
2016-06-03 12:47:54 +00:00
|
|
|
|
CMake doesn't detect the right Python version
|
|
|
|
|
=============================================
|
2016-05-17 08:47:52 +00:00
|
|
|
|
|
2016-06-03 12:47:54 +00:00
|
|
|
|
The CMake-based build system will try to automatically detect the installed
|
|
|
|
|
version of Python and link against that. When this fails, or when there are
|
|
|
|
|
multiple versions of Python and it finds the wrong one, delete
|
|
|
|
|
``CMakeCache.txt`` and then invoke CMake as follows:
|
2016-05-17 08:47:52 +00:00
|
|
|
|
|
|
|
|
|
.. code-block:: bash
|
|
|
|
|
|
2016-06-03 12:47:54 +00:00
|
|
|
|
cmake -DPYTHON_EXECUTABLE:FILEPATH=<path-to-python-executable> .
|
2016-05-17 08:47:52 +00:00
|
|
|
|
|
2016-03-09 20:11:19 +00:00
|
|
|
|
Limitations involving reference arguments
|
|
|
|
|
=========================================
|
|
|
|
|
|
|
|
|
|
In C++, it's fairly common to pass arguments using mutable references or
|
|
|
|
|
mutable pointers, which allows both read and write access to the value
|
|
|
|
|
supplied by the caller. This is sometimes done for efficiency reasons, or to
|
|
|
|
|
realize functions that have multiple return values. Here are two very basic
|
|
|
|
|
examples:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
void increment(int &i) { i++; }
|
|
|
|
|
void increment_ptr(int *i) { (*i)++; }
|
|
|
|
|
|
|
|
|
|
In Python, all arguments are passed by reference, so there is no general
|
|
|
|
|
issue in binding such code from Python.
|
|
|
|
|
|
|
|
|
|
However, certain basic Python types (like ``str``, ``int``, ``bool``,
|
|
|
|
|
``float``, etc.) are **immutable**. This means that the following attempt
|
|
|
|
|
to port the function to Python doesn't have the same effect on the value
|
|
|
|
|
provided by the caller -- in fact, it does nothing at all.
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
def increment(i):
|
|
|
|
|
i += 1 # nope..
|
|
|
|
|
|
2016-03-09 20:31:21 +00:00
|
|
|
|
pybind11 is also affected by such language-level conventions, which means that
|
|
|
|
|
binding ``increment`` or ``increment_ptr`` will also create Python functions
|
|
|
|
|
that don't modify their arguments.
|
|
|
|
|
|
|
|
|
|
Although inconvenient, one workaround is to encapsulate the immutable types in
|
2016-04-14 09:27:15 +00:00
|
|
|
|
a custom type that does allow modifications.
|
2016-03-09 20:31:21 +00:00
|
|
|
|
|
|
|
|
|
An other alternative involves binding a small wrapper lambda function that
|
|
|
|
|
returns a tuple with all output arguments (see the remainder of the
|
|
|
|
|
documentation for examples on binding lambda functions). An example:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
int foo(int &i) { i++; return 123; }
|
|
|
|
|
|
|
|
|
|
and the binding code
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
m.def("foo", [](int i) { int rv = foo(i); return std::make_tuple(rv, i); });
|
2016-03-09 20:11:19 +00:00
|
|
|
|
|
2016-04-14 09:27:15 +00:00
|
|
|
|
|
2016-04-17 19:54:31 +00:00
|
|
|
|
How can I reduce the build time?
|
|
|
|
|
================================
|
|
|
|
|
|
2016-10-22 16:54:33 +00:00
|
|
|
|
It's good practice to split binding code over multiple files, as in the
|
|
|
|
|
following example:
|
|
|
|
|
|
|
|
|
|
:file:`example.cpp`:
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
void init_ex1(py::module &);
|
|
|
|
|
void init_ex2(py::module &);
|
|
|
|
|
/* ... */
|
|
|
|
|
|
2017-04-23 23:51:44 +00:00
|
|
|
|
PYBIND11_MODULE(example, m) {
|
2016-04-17 19:54:31 +00:00
|
|
|
|
init_ex1(m);
|
|
|
|
|
init_ex2(m);
|
|
|
|
|
/* ... */
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-22 16:54:33 +00:00
|
|
|
|
:file:`ex1.cpp`:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
void init_ex1(py::module &m) {
|
|
|
|
|
m.def("add", [](int a, int b) { return a + b; });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:file:`ex2.cpp`:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
2018-04-24 14:16:18 +00:00
|
|
|
|
void init_ex2(py::module &m) {
|
2016-10-22 16:54:33 +00:00
|
|
|
|
m.def("sub", [](int a, int b) { return a - b; });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:command:`python`:
|
|
|
|
|
|
|
|
|
|
.. code-block:: pycon
|
|
|
|
|
|
|
|
|
|
>>> import example
|
|
|
|
|
>>> example.add(1, 2)
|
|
|
|
|
3
|
|
|
|
|
>>> example.sub(1, 1)
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
|
As shown above, the various ``init_ex`` functions should be contained in
|
|
|
|
|
separate files that can be compiled independently from one another, and then
|
|
|
|
|
linked together into the same final shared object. Following this approach
|
|
|
|
|
will:
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
1. reduce memory requirements per compilation unit.
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
2. enable parallel builds (if desired).
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
3. allow for faster incremental builds. For instance, when a single class
|
2016-09-21 17:39:02 +00:00
|
|
|
|
definition is changed, only a subset of the binding code will generally need
|
2016-04-28 12:33:45 +00:00
|
|
|
|
to be recompiled.
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2016-11-16 16:36:54 +00:00
|
|
|
|
"recursive template instantiation exceeded maximum depth of 256"
|
|
|
|
|
================================================================
|
|
|
|
|
|
|
|
|
|
If you receive an error about excessive recursive template evaluation, try
|
|
|
|
|
specifying a larger value, e.g. ``-ftemplate-depth=1024`` on GCC/Clang. The
|
|
|
|
|
culprit is generally the generation of function signatures at compile time
|
|
|
|
|
using C++14 template metaprogramming.
|
|
|
|
|
|
2017-08-10 16:08:42 +00:00
|
|
|
|
.. _`faq:hidden_visibility`:
|
|
|
|
|
|
|
|
|
|
"‘SomeClass’ declared with greater visibility than the type of its field ‘SomeClass::member’ [-Wattributes]"
|
|
|
|
|
============================================================================================================
|
|
|
|
|
|
|
|
|
|
This error typically indicates that you are compiling without the required
|
|
|
|
|
``-fvisibility`` flag. pybind11 code internally forces hidden visibility on
|
|
|
|
|
all internal code, but if non-hidden (and thus *exported*) code attempts to
|
|
|
|
|
include a pybind type (for example, ``py::object`` or ``py::list``) you can run
|
|
|
|
|
into this warning.
|
|
|
|
|
|
|
|
|
|
To avoid it, make sure you are specifying ``-fvisibility=hidden`` when
|
|
|
|
|
compiling pybind code.
|
|
|
|
|
|
|
|
|
|
As to why ``-fvisibility=hidden`` is necessary, because pybind modules could
|
|
|
|
|
have been compiled under different versions of pybind itself, it is also
|
|
|
|
|
important that the symbols defined in one module do not clash with the
|
|
|
|
|
potentially-incompatible symbols defined in another. While Python extension
|
|
|
|
|
modules are usually loaded with localized symbols (under POSIX systems
|
|
|
|
|
typically using ``dlopen`` with the ``RTLD_LOCAL`` flag), this Python default
|
|
|
|
|
can be changed, but even if it isn't it is not always enough to guarantee
|
|
|
|
|
complete independence of the symbols involved when not using
|
|
|
|
|
``-fvisibility=hidden``.
|
|
|
|
|
|
|
|
|
|
Additionally, ``-fvisiblity=hidden`` can deliver considerably binary size
|
|
|
|
|
savings. (See the following section for more details).
|
|
|
|
|
|
2016-11-16 16:36:54 +00:00
|
|
|
|
|
2016-12-13 15:55:38 +00:00
|
|
|
|
.. _`faq:symhidden`:
|
|
|
|
|
|
2016-04-17 19:54:31 +00:00
|
|
|
|
How can I create smaller binaries?
|
|
|
|
|
==================================
|
|
|
|
|
|
|
|
|
|
To do its job, pybind11 extensively relies on a programming technique known as
|
|
|
|
|
*template metaprogramming*, which is a way of performing computation at compile
|
|
|
|
|
time using type information. Template metaprogamming usually instantiates code
|
|
|
|
|
involving significant numbers of deeply nested types that are either completely
|
2016-09-21 17:39:02 +00:00
|
|
|
|
removed or reduced to just a few instructions during the compiler's optimization
|
2016-04-17 19:54:31 +00:00
|
|
|
|
phase. However, due to the nested nature of these types, the resulting symbol
|
|
|
|
|
names in the compiled extension library can be extremely long. For instance,
|
|
|
|
|
the included test suite contains the following symbol:
|
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
.. only:: html
|
|
|
|
|
|
|
|
|
|
.. code-block:: none
|
|
|
|
|
|
2016-09-06 04:02:29 +00:00
|
|
|
|
__ZN8pybind1112cpp_functionC1Iv8Example2JRNSt3__16vectorINS3_12basic_stringIwNS3_11char_traitsIwEENS3_9allocatorIwEEEENS8_ISA_EEEEEJNS_4nameENS_7siblingENS_9is_methodEA28_cEEEMT0_FT_DpT1_EDpRKT2_
|
2016-04-28 12:33:45 +00:00
|
|
|
|
|
|
|
|
|
.. only:: not html
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
__ZN8pybind1112cpp_functionC1Iv8Example2JRNSt3__16vectorINS3_12basic_stringIwNS3_11char_traitsIwEENS3_9allocatorIwEEEENS8_ISA_EEEEEJNS_4nameENS_7siblingENS_9is_methodEA28_cEEEMT0_FT_DpT1_EDpRKT2_
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
|
|
|
|
which is the mangled form of the following function type:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
|
|
pybind11::cpp_function::cpp_function<void, Example2, std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >&, pybind11::name, pybind11::sibling, pybind11::is_method, char [28]>(void (Example2::*)(std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >&), pybind11::name const&, pybind11::sibling const&, pybind11::is_method const&, char const (&) [28])
|
|
|
|
|
|
2016-04-28 12:33:45 +00:00
|
|
|
|
The memory needed to store just the mangled name of this function (196 bytes)
|
|
|
|
|
is larger than the actual piece of code (111 bytes) it represents! On the other
|
|
|
|
|
hand, it's silly to even give this function a name -- after all, it's just a
|
|
|
|
|
tiny cog in a bigger piece of machinery that is not exposed to the outside
|
|
|
|
|
world. So we'll generally only want to export symbols for those functions which
|
|
|
|
|
are actually called from the outside.
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
|
|
|
|
This can be achieved by specifying the parameter ``-fvisibility=hidden`` to GCC
|
2017-08-10 16:08:42 +00:00
|
|
|
|
and Clang, which sets the default symbol visibility to *hidden*, which has a
|
|
|
|
|
tremendous impact on the final binary size of the resulting extension library.
|
|
|
|
|
(On Visual Studio, symbols are already hidden by default, so nothing needs to
|
|
|
|
|
be done there.)
|
|
|
|
|
|
|
|
|
|
In addition to decreasing binary size, ``-fvisibility=hidden`` also avoids
|
|
|
|
|
potential serious issues when loading multiple modules and is required for
|
|
|
|
|
proper pybind operation. See the previous FAQ entry for more details.
|
2016-04-17 19:54:31 +00:00
|
|
|
|
|
2018-02-06 15:07:27 +00:00
|
|
|
|
Working with ancient Visual Studio 2008 builds on Windows
|
2016-05-03 12:32:47 +00:00
|
|
|
|
=========================================================
|
|
|
|
|
|
|
|
|
|
The official Windows distributions of Python are compiled using truly
|
|
|
|
|
ancient versions of Visual Studio that lack good C++11 support. Some users
|
|
|
|
|
implicitly assume that it would be impossible to load a plugin built with
|
|
|
|
|
Visual Studio 2015 into a Python distribution that was compiled using Visual
|
2018-02-06 15:07:27 +00:00
|
|
|
|
Studio 2008. However, no such issue exists: it's perfectly legitimate to
|
2016-05-03 12:32:47 +00:00
|
|
|
|
interface DLLs that are built with different compilers and/or C libraries.
|
|
|
|
|
Common gotchas to watch out for involve not ``free()``-ing memory region
|
|
|
|
|
that that were ``malloc()``-ed in another shared library, using data
|
|
|
|
|
structures with incompatible ABIs, and so on. pybind11 is very careful not
|
|
|
|
|
to make these types of mistakes.
|
2017-11-17 17:44:20 +00:00
|
|
|
|
|
2018-09-11 22:20:56 +00:00
|
|
|
|
Inconsistent detection of Python version in CMake and pybind11
|
|
|
|
|
==============================================================
|
|
|
|
|
|
|
|
|
|
The functions ``find_package(PythonInterp)`` and ``find_package(PythonLibs)`` provided by CMake
|
|
|
|
|
for Python version detection are not used by pybind11 due to unreliability and limitations that make
|
|
|
|
|
them unsuitable for pybind11's needs. Instead pybind provides its own, more reliable Python detection
|
|
|
|
|
CMake code. Conflicts can arise, however, when using pybind11 in a project that *also* uses the CMake
|
|
|
|
|
Python detection in a system with several Python versions installed.
|
|
|
|
|
|
|
|
|
|
This difference may cause inconsistencies and errors if *both* mechanisms are used in the same project. Consider the following
|
|
|
|
|
Cmake code executed in a system with Python 2.7 and 3.x installed:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
|
|
find_package(PythonInterp)
|
|
|
|
|
find_package(PythonLibs)
|
|
|
|
|
find_package(pybind11)
|
|
|
|
|
|
|
|
|
|
It will detect Python 2.7 and pybind11 will pick it as well.
|
|
|
|
|
|
|
|
|
|
In contrast this code:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
|
|
find_package(pybind11)
|
|
|
|
|
find_package(PythonInterp)
|
|
|
|
|
find_package(PythonLibs)
|
|
|
|
|
|
|
|
|
|
will detect Python 3.x for pybind11 and may crash on ``find_package(PythonLibs)`` afterwards.
|
|
|
|
|
|
|
|
|
|
It is advised to avoid using ``find_package(PythonInterp)`` and ``find_package(PythonLibs)`` from CMake and rely
|
|
|
|
|
on pybind11 in detecting Python version. If this is not possible CMake machinery should be called *before* including pybind11.
|
|
|
|
|
|
2017-11-17 17:44:20 +00:00
|
|
|
|
How to cite this project?
|
|
|
|
|
=========================
|
|
|
|
|
|
|
|
|
|
We suggest the following BibTeX template to cite pybind11 in scientific
|
|
|
|
|
discourse:
|
|
|
|
|
|
|
|
|
|
.. code-block:: bash
|
|
|
|
|
|
|
|
|
|
@misc{pybind11,
|
|
|
|
|
author = {Wenzel Jakob and Jason Rhinelander and Dean Moldovan},
|
|
|
|
|
year = {2017},
|
|
|
|
|
note = {https://github.com/pybind/pybind11},
|
|
|
|
|
title = {pybind11 -- Seamless operability between C++11 and Python}
|
|
|
|
|
}
|