\chapter{Embedding Python in Another Application
     \label{embedding}}

The previous chapters discussed how to extend Python, that is, how to
extend the functionality of Python by attaching a library of C
functions to it.  It is also possible to do it the other way around:
enrich your C/\Cpp{} application by embedding Python in it.  Embedding
provides your application with the ability to implement some of the
functionality of your application in Python rather than C or \Cpp.
This can be used for many purposes; one example would be to allow
users to tailor the application to their needs by writing some scripts
in Python.  You can also use it yourself if some of the functionality
can be written in Python more easily.

Embedding Python is similar to extending it, but not quite.  The
difference is that when you extend Python, the main program of the
application is still the Python interpreter, while if you embed
Python, the main program may have nothing to do with Python ---
instead, some parts of the application occasionally call the Python
interpreter to run some Python code.

So if you are embedding Python, you are providing your own main
program.  One of the things this main program has to do is initialize
the Python interpreter.  At the very least, you have to call the
function \cfunction{Py_Initialize()} (on Mac OS, call
\cfunction{PyMac_Initialize()} instead).  There are optional calls to
pass command line arguments to Python.  Then later you can call the
interpreter from any part of the application.

There are several different ways to call the interpreter: you can pass
a string containing Python statements to
\cfunction{PyRun_SimpleString()}, or you can pass a stdio file pointer
and a file name (for identification in error messages only) to
\cfunction{PyRun_SimpleFile()}.  You can also call the lower-level
operations described in the previous chapters to construct and use
Python objects.

A simple demo of embedding Python can be found in the directory
\file{Demo/embed/} of the source distribution.


\begin{seealso}
  \seetitle[../api/api.html]{Python/C API Reference Manual}{The
            details of Python's C interface are given in this manual.
            A great deal of necessary information can be found here.}
\end{seealso}


\section{Very High Level Embedding
         \label{high-level-embedding}}

The simplest form of embedding Python is the use of the very
high level interface. This interface is intended to execute a
Python script without needing to interact with the application
directly. This can for example be used to perform some operation
on a file.

\begin{verbatim}
#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
}
\end{verbatim}

The above code first initializes the Python interpreter with
\cfunction{Py_Initialize()}, followed by the execution of a hard-coded
Python script that print the date and time.  Afterwards, the
\cfunction{Py_Finalize()} call shuts the interpreter down, followed by
the end of the program.  In a real program, you may want to get the
Python script from another source, perhaps a text-editor routine, a
file, or a database.  Getting the Python code from a file can better
be done by using the \cfunction{PyRun_SimpleFile()} function, which
saves you the trouble of allocating memory space and loading the file
contents.


\section{Beyond Very High Level Embedding: An overview
         \label{lower-level-embedding}}

The high level interface gives you the ability to execute
arbitrary pieces of Python code from your application, but
exchanging data values is quite cumbersome to say the least. If
you want that, you should use lower level calls. At the cost of
having to write more C code, you can achieve almost anything.

It should be noted that extending Python and embedding Python
is quite the same activity, despite the different intent. Most
topics discussed in the previous chapters are still valid. To
show this, consider what the extension code from Python to C
really does:

\begin{enumerate}
    \item Convert data values from Python to C,
    \item Perform a function call to a C routine using the
        converted values, and
    \item Convert the data values from the call from C to Python.
\end{enumerate}

When embedding Python, the interface code does:

\begin{enumerate}
    \item Convert data values from C to Python,
    \item Perform a function call to a Python interface routine
        using the converted values, and
    \item Convert the data values from the call from Python to C.
\end{enumerate}

As you can see, the data conversion steps are simply swapped to
accomodate the different direction of the cross-language transfer.
The only difference is the routine that you call between both
data conversions. When extending, you call a C routine, when
embedding, you call a Python routine.

This chapter will not discuss how to convert data from Python
to C and vice versa.  Also, proper use of references and dealing
with errors is assumed to be understood.  Since these aspects do not
differ from extending the interpreter, you can refer to earlier
chapters for the required information.


\section{Pure Embedding
         \label{pure-embedding}}

The first program aims to execute a function in a Python
script. Like in the section about the very high level interface,
the Python interpreter does not directly interact with the
application (but that will change in th next section).

The code to run a function defined in a Python script is:

\verbatiminput{run-func.c}

This code loads a Python script using \code{argv[1]}, and calls the
function named in \code{argv[2]}.  Its integer arguments are the other
values of the \code{argv} array.  If you compile and link this
program (let's call the finished executable \program{call}), and use
it to execute a Python script, such as:

\begin{verbatim}
def multiply(a,b):
    print "Will compute", a, "times", b
    c = 0
    for i in range(0, a):
        c = c + b
    return c
\end{verbatim}

then the result should be:

\begin{verbatim}
$ call multiply multiply 3 2
Will compute 3 times 2
Result of call: 6
\end{verbatim} % $

Although the program is quite large for its functionality, most of the
code is for data conversion between Python and C, and for error
reporting.  The interesting part with respect to embedding Python
starts with

\begin{verbatim}
    Py_Initialize();
    pName = PyString_FromString(argv[1]);
    /* Error checking of pName left out */
    pModule = PyImport_Import(pName);
\end{verbatim}

After initializing the interpreter, the script is loaded using
\cfunction{PyImport_Import()}.  This routine needs a Python string
as its argument, which is constructed using the
\cfunction{PyString_FromString()} data conversion routine.

\begin{verbatim}
    pFunc = PyObject_GetAttrString(pModule, argv[2]);
    /* pFunc is a new reference */

    if (pFunc && PyCallable_Check(pFunc)) {
        ...
    }
    Py_XDECREF(pFunc);
\end{verbatim}

Once the script is loaded, the name we're looking for is retrieved
using \cfunction{PyObject_GetAttrString()}.  If the name exists, and
the object returned is callable, you can safely assume that it is a
function.  The program then proceeds by constructing a tuple of
arguments as normal.  The call to the Python function is then made
with:

\begin{verbatim}
    pValue = PyObject_CallObject(pFunc, pArgs);
\end{verbatim}

Upon return of the function, \code{pValue} is either \NULL{} or it
contains a reference to the return value of the function.  Be sure to
release the reference after examining the value.


\section{Extending Embedded Python
         \label{extending-with-embedding}}

Until now, the embedded Python interpreter had no access to
functionality from the application itself.  The Python API allows this
by extending the embedded interpreter.  That is, the embedded
interpreter gets extended with routines provided by the application.
While it sounds complex, it is not so bad.  Simply forget for a while
that the application starts the Python interpreter.  Instead, consider
the application to be a set of subroutines, and write some glue code
that gives Python access to those routines, just like you would write
a normal Python extension.  For example:

\begin{verbatim}
static int numargs=0;

/* Return the number of arguments of the application command line */
static PyObject*
emb_numargs(PyObject *self, PyObject *args)
{
    if(!PyArg_ParseTuple(args, ":numargs"))
        return NULL;
    return Py_BuildValue("i", numargs);
}

static PyMethodDef EmbMethods[] = {
    {"numargs", emb_numargs, METH_VARARGS,
     "Return the number of arguments received by the process."},
    {NULL, NULL, 0, NULL}
};
\end{verbatim}

Insert the above code just above the \cfunction{main()} function.
Also, insert the following two statements directly after
\cfunction{Py_Initialize()}:

\begin{verbatim}
    numargs = argc;
    Py_InitModule("emb", EmbMethods);
\end{verbatim}

These two lines initialize the \code{numargs} variable, and make the
\function{emb.numargs()} function accessible to the embedded Python
interpreter.  With these extensions, the Python script can do things
like

\begin{verbatim}
import emb
print "Number of arguments", emb.numargs()
\end{verbatim}

In a real application, the methods will expose an API of the
application to Python.


%\section{For the future}
%
%You don't happen to have a nice library to get textual
%equivalents of numeric values do you :-) ?
%Callbacks here ? (I may be using information from that section
%?!)
%threads
%code examples do not really behave well if errors happen
% (what to watch out for)


\section{Embedding Python in \Cpp
     \label{embeddingInCplusplus}}

It is also possible to embed Python in a \Cpp{} program; precisely how this
is done will depend on the details of the \Cpp{} system used; in general you
will need to write the main program in \Cpp, and use the \Cpp{} compiler
to compile and link your program.  There is no need to recompile Python
itself using \Cpp.


\section{Linking Requirements
         \label{link-reqs}}

While the \program{configure} script shipped with the Python sources
will correctly build Python to export the symbols needed by
dynamically linked extensions, this is not automatically inherited by
applications which embed the Python library statically, at least on
\UNIX.  This is an issue when the application is linked to the static
runtime library (\file{libpython.a}) and needs to load dynamic
extensions (implemented as \file{.so} files).

The problem is that some entry points are defined by the Python
runtime solely for extension modules to use.  If the embedding
application does not use any of these entry points, some linkers will
not include those entries in the symbol table of the finished
executable.  Some additional options are needed to inform the linker
not to remove these symbols.

Determining the right options to use for any given platform can be
quite difficult, but fortunately the Python configuration already has
those values.  To retrieve them from an installed Python interpreter,
start an interactive interpreter and have a short session like this:

\begin{verbatim}
>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var('LINKFORSHARED')
'-Xlinker -export-dynamic'
\end{verbatim}
\refstmodindex{distutils.sysconfig}

The contents of the string presented will be the options that should
be used.  If the string is empty, there's no need to add any
additional options.  The \constant{LINKFORSHARED} definition
corresponds to the variable of the same name in Python's top-level
\file{Makefile}.
