Commit ad0a820a authored by Stefan Behnel's avatar Stefan Behnel

Rewrite the docs section on embedding multiple modules into one binary.

parent 77fc0ac3
...@@ -17,6 +17,7 @@ Cython code, unlike Python, must be compiled. This happens in two stages: ...@@ -17,6 +17,7 @@ Cython code, unlike Python, must be compiled. This happens in two stages:
The following sub-sections describe several ways to build your The following sub-sections describe several ways to build your
extension modules, and how to pass directives to the Cython compiler. extension modules, and how to pass directives to the Cython compiler.
Compiling from the command line Compiling from the command line
=============================== ===============================
...@@ -43,44 +44,54 @@ paths to libraries you need to link with] ...@@ -43,44 +44,54 @@ paths to libraries you need to link with]
A ``yourmod.so`` file is now in the same directory and your module, A ``yourmod.so`` file is now in the same directory and your module,
``yourmod``, is available for you to import as you normally would. ``yourmod``, is available for you to import as you normally would.
Compiling in a embedded interpreter
===================================
Sometimes you might want to use cython to compile a python module you Integrating multiple modules
made into your hand made embedded python. Here is how to do that. ============================
It some scenarios, it can be useful to link multiple Cython modules
(or other extension modules) into a single binary, e.g. when embedding
Python in another application. This can be done through the inittab
import mechanism of CPython.
On the top of your C file above the main function you created Create a new C file to integrate the extension modules and add this
type this without the quotes:: macro to it::
PyMODINIT_FUNC PyInit__test(void); #if PY_MAJOR_VERSION < 3
# define MODINIT(name) init ## name
#else
# define MODINIT(name) PyInit_ ## name
#endif
for python 3.x and:: If you are only targeting Python 3.x, just use ``PyInit_`` as prefix.
PyMODINIT_FUNC init_test(void); Then, for each or the modules, declare its module init function
as follows, replacing ``...`` by the name of the module::
for python 2. PyMODINIT_FUNC MODINIT(...) (void);
Where Module Name is the name of the module you cythonized. If you In C++, declare them as ``extern C``.
are not sure on the name of the module init function refer to your
generated module source file.
You need to use ``PyImport_AppendInittab`` but right If you are not sure of the name of the module init function, refer
before you use ``Py_SetProgramName`` and ``Py_Initialize`` in your to your generated module source file and look for a function name
main as well:: starting with ``PyInit_``.
PyImport_AppendInittab("_test", PyInit__test); Next, before you start the Python runtime from your application code
with ``Py_Initialize()``, you need to initialise the modules at runtime
using the ``PyImport_AppendInittab()`` C-API function, again inserting
the name of each of the modules::
for python 3.x and:: PyImport_AppendInittab("...", MODINIT(...));
PyImport_AppendInittab("_test", init_test) This enables normal imports for the embedded extension modules.
After that is done go in and for all the sources you use define the In order to prevent the joined binary from exporting all of the module
following in the compiler's command line:: init functions as public symbols, Cython 0.28 and later can hide these
symbols if the macro ``CYTHON_NO_PYINIT_EXPORT`` is defined while
C-compiling the module C files.
CYTHON_NO_PYINIT_EXPORT Also take a look at the `cython_freeze
<https://github.com/cython/cython/blob/master/bin/cython_freeze>` tool.
This macro is to ensure that your module initialization function is
not exported.
Compiling with ``distutils`` Compiling with ``distutils``
============================ ============================
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment