| \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 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}. |