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.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							3.9 KiB
						
					
					
				| Frequently asked questions | |
| ########################## | |
|  | |
| (under construction) | |
|  | |
| ImportError: dynamic module does not define init function | |
| ========================================================= | |
| 
 | |
| 1. Make sure that the name specified in ``pybind::module`` and | |
|    ``PYBIND11_PLUGIN`` is consistent and identical to the filename of the | |
|    extension library. The latter should not contain any extra prefixes (e.g. | |
|    ``test.so`` instead of ``libtest.so``). | |
|  | |
| 2. If the above did not fix your issue, then 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) | |
|  | |
| 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.. | |
| 
 | |
| 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 | |
| a custom type that does allow modifications. | |
|  | |
| 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); }); | |
| 
 | |
| CMake doesn't detect the right Python version, or it finds mismatched interpreter and library versions | |
| ====================================================================================================== | |
|  | |
| The Python detection logic of CMake is flawed and can sometimes fail to find | |
| the desired Python version, or it chooses mismatched interpreter and library | |
| versions. A longer discussion is available on the pybind11 issue tracker | |
| [#f1]_, though this is ultimately not a pybind11 issue. | |
|  | |
| To force the build system to choose a particular version, delete CMakeCache.txt | |
| and then invoke CMake as follows: | |
|  | |
| .. code-block:: bash | |
| 
 | |
|     cmake -DPYTHON_EXECUTABLE:FILEPATH=<...> \ | |
|           -DPYTHON_LIBRARY:FILEPATH=<...>  \ | |
|           -DPYTHON_INCLUDE_DIR:PATH=<...> . | |
| 
 | |
| .. [#f1] http://github.com/pybind/pybind11/issues/99 | |
|  | |
| Working with ancient Visual Studio 2009 builds on Windows | |
| ========================================================= | |
|  | |
| 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 | |
| Studio 2009. However, no such issue exists: it's perfectly legitimate to | |
| 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. | |
| 
 |