# Linux Kernel Module Cheat

##### 27.7.1.4. Embedding Python in another application

Here we will add some better examples and explanations for: https://docs.python.org/3/extending/embedding.html#very-high-level-embedding

"Embedding Python" basically means calling the Python interpreter from C, and possibly passing values between the two.

These examples show to to embed the Python interpreter into a C/C++ application to interface between them

- userland/libs/python_embed/eval.c: this example simply does `eval` a Python string in C, and don’t communicate any values between the two.

  It could be used to call external commands that have external side effects, but it is not very exciting.

- userland/libs/python_embed/pure.c: this example actually defines some Python classes and functions from C, implementing those entirely in C.

  The C program that defines those classes then instantiates the interpreter calls some regular Python code from it: userland/libs/python_embed/pure.py

  The regular Python code can then use the native C classes as if they were defined in Python.

  Finally, the Python returns values back to the C code that called the interpreter.

- userland/libs/python_embed/pure_cpp.cpp: C version of the above, the main goal of this example is to show how to interface with C classes.

  See also: https://stackoverflow.com/questions/2200912/inheritance-in-python-c-extension/60436902#60436902

One notable user of Python embedding is the gem5 simulator, see also: gem5 vs QEMU. gem5 embeds the Python interpreter in order to interpret scripts as seen from the CLI:

    build/ARM/gem5.opt configs/example/fs.py

gem5 then runs that Python script, which instantiates C classes defined from Python, and then finally hands back control to the C runtime to run the actual simulation faster.