1.. highlightlang:: c 2 3 4.. _embedding: 5 6*************************************** 7Embedding Python in Another Application 8*************************************** 9 10The previous chapters discussed how to extend Python, that is, how to extend the 11functionality of Python by attaching a library of C functions to it. It is also 12possible to do it the other way around: enrich your C/C++ application by 13embedding Python in it. Embedding provides your application with the ability to 14implement some of the functionality of your application in Python rather than C 15or C++. This can be used for many purposes; one example would be to allow users 16to tailor the application to their needs by writing some scripts in Python. You 17can also use it yourself if some of the functionality can be written in Python 18more easily. 19 20Embedding Python is similar to extending it, but not quite. The difference is 21that when you extend Python, the main program of the application is still the 22Python interpreter, while if you embed Python, the main program may have nothing 23to do with Python --- instead, some parts of the application occasionally call 24the Python interpreter to run some Python code. 25 26So if you are embedding Python, you are providing your own main program. One of 27the things this main program has to do is initialize the Python interpreter. At 28the very least, you have to call the function :c:func:`Py_Initialize`. There are 29optional calls to pass command line arguments to Python. Then later you can 30call the interpreter from any part of the application. 31 32There are several different ways to call the interpreter: you can pass a string 33containing Python statements to :c:func:`PyRun_SimpleString`, or you can pass a 34stdio file pointer and a file name (for identification in error messages only) 35to :c:func:`PyRun_SimpleFile`. You can also call the lower-level operations 36described in the previous chapters to construct and use Python objects. 37 38A simple demo of embedding Python can be found in the directory 39:file:`Demo/embed/` of the source distribution. 40 41 42.. seealso:: 43 44 :ref:`c-api-index` 45 The details of Python's C interface are given in this manual. A great deal of 46 necessary information can be found here. 47 48 49.. _high-level-embedding: 50 51Very High Level Embedding 52========================= 53 54The simplest form of embedding Python is the use of the very high level 55interface. This interface is intended to execute a Python script without needing 56to interact with the application directly. This can for example be used to 57perform some operation on a file. :: 58 59 #include <Python.h> 60 61 int 62 main(int argc, char *argv[]) 63 { 64 Py_SetProgramName(argv[0]); /* optional but recommended */ 65 Py_Initialize(); 66 PyRun_SimpleString("from time import time,ctime\n" 67 "print 'Today is',ctime(time())\n"); 68 Py_Finalize(); 69 return 0; 70 } 71 72The :c:func:`Py_SetProgramName` function should be called before 73:c:func:`Py_Initialize` to inform the interpreter about paths to Python run-time 74libraries. Next, the Python interpreter is initialized with 75:c:func:`Py_Initialize`, followed by the execution of a hard-coded Python script 76that prints the date and time. Afterwards, the :c:func:`Py_Finalize` call shuts 77the interpreter down, followed by the end of the program. In a real program, 78you may want to get the Python script from another source, perhaps a text-editor 79routine, a file, or a database. Getting the Python code from a file can better 80be done by using the :c:func:`PyRun_SimpleFile` function, which saves you the 81trouble of allocating memory space and loading the file contents. 82 83 84.. _lower-level-embedding: 85 86Beyond Very High Level Embedding: An overview 87============================================= 88 89The high level interface gives you the ability to execute arbitrary pieces of 90Python code from your application, but exchanging data values is quite 91cumbersome to say the least. If you want that, you should use lower level calls. 92At the cost of having to write more C code, you can achieve almost anything. 93 94It should be noted that extending Python and embedding Python is quite the same 95activity, despite the different intent. Most topics discussed in the previous 96chapters are still valid. To show this, consider what the extension code from 97Python to C really does: 98 99#. Convert data values from Python to C, 100 101#. Perform a function call to a C routine using the converted values, and 102 103#. Convert the data values from the call from C to Python. 104 105When embedding Python, the interface code does: 106 107#. Convert data values from C to Python, 108 109#. Perform a function call to a Python interface routine using the converted 110 values, and 111 112#. Convert the data values from the call from Python to C. 113 114As you can see, the data conversion steps are simply swapped to accommodate the 115different direction of the cross-language transfer. The only difference is the 116routine that you call between both data conversions. When extending, you call a 117C routine, when embedding, you call a Python routine. 118 119This chapter will not discuss how to convert data from Python to C and vice 120versa. Also, proper use of references and dealing with errors is assumed to be 121understood. Since these aspects do not differ from extending the interpreter, 122you can refer to earlier chapters for the required information. 123 124 125.. _pure-embedding: 126 127Pure Embedding 128============== 129 130The first program aims to execute a function in a Python script. Like in the 131section about the very high level interface, the Python interpreter does not 132directly interact with the application (but that will change in the next 133section). 134 135The code to run a function defined in a Python script is: 136 137.. literalinclude:: ../includes/run-func.c 138 139 140This code loads a Python script using ``argv[1]``, and calls the function named 141in ``argv[2]``. Its integer arguments are the other values of the ``argv`` 142array. If you compile and link this program (let's call the finished executable 143:program:`call`), and use it to execute a Python script, such as: 144 145.. code-block:: python 146 147 def multiply(a,b): 148 print "Will compute", a, "times", b 149 c = 0 150 for i in range(0, a): 151 c = c + b 152 return c 153 154then the result should be: 155 156.. code-block:: shell-session 157 158 $ call multiply multiply 3 2 159 Will compute 3 times 2 160 Result of call: 6 161 162Although the program is quite large for its functionality, most of the code is 163for data conversion between Python and C, and for error reporting. The 164interesting part with respect to embedding Python starts with :: 165 166 Py_Initialize(); 167 pName = PyString_FromString(argv[1]); 168 /* Error checking of pName left out */ 169 pModule = PyImport_Import(pName); 170 171After initializing the interpreter, the script is loaded using 172:c:func:`PyImport_Import`. This routine needs a Python string as its argument, 173which is constructed using the :c:func:`PyString_FromString` data conversion 174routine. :: 175 176 pFunc = PyObject_GetAttrString(pModule, argv[2]); 177 /* pFunc is a new reference */ 178 179 if (pFunc && PyCallable_Check(pFunc)) { 180 ... 181 } 182 Py_XDECREF(pFunc); 183 184Once the script is loaded, the name we're looking for is retrieved using 185:c:func:`PyObject_GetAttrString`. If the name exists, and the object returned is 186callable, you can safely assume that it is a function. The program then 187proceeds by constructing a tuple of arguments as normal. The call to the Python 188function is then made with:: 189 190 pValue = PyObject_CallObject(pFunc, pArgs); 191 192Upon return of the function, ``pValue`` is either *NULL* or it contains a 193reference to the return value of the function. Be sure to release the reference 194after examining the value. 195 196 197.. _extending-with-embedding: 198 199Extending Embedded Python 200========================= 201 202Until now, the embedded Python interpreter had no access to functionality from 203the application itself. The Python API allows this by extending the embedded 204interpreter. That is, the embedded interpreter gets extended with routines 205provided by the application. While it sounds complex, it is not so bad. Simply 206forget for a while that the application starts the Python interpreter. Instead, 207consider the application to be a set of subroutines, and write some glue code 208that gives Python access to those routines, just like you would write a normal 209Python extension. For example:: 210 211 static int numargs=0; 212 213 /* Return the number of arguments of the application command line */ 214 static PyObject* 215 emb_numargs(PyObject *self, PyObject *args) 216 { 217 if(!PyArg_ParseTuple(args, ":numargs")) 218 return NULL; 219 return Py_BuildValue("i", numargs); 220 } 221 222 static PyMethodDef EmbMethods[] = { 223 {"numargs", emb_numargs, METH_VARARGS, 224 "Return the number of arguments received by the process."}, 225 {NULL, NULL, 0, NULL} 226 }; 227 228Insert the above code just above the :c:func:`main` function. Also, insert the 229following two statements directly after :c:func:`Py_Initialize`:: 230 231 numargs = argc; 232 Py_InitModule("emb", EmbMethods); 233 234These two lines initialize the ``numargs`` variable, and make the 235:func:`emb.numargs` function accessible to the embedded Python interpreter. 236With these extensions, the Python script can do things like 237 238.. code-block:: python 239 240 import emb 241 print "Number of arguments", emb.numargs() 242 243In a real application, the methods will expose an API of the application to 244Python. 245 246.. TODO: threads, code examples do not really behave well if errors happen 247 (what to watch out for) 248 249 250.. _embeddingincplusplus: 251 252Embedding Python in C++ 253======================= 254 255It is also possible to embed Python in a C++ program; precisely how this is done 256will depend on the details of the C++ system used; in general you will need to 257write the main program in C++, and use the C++ compiler to compile and link your 258program. There is no need to recompile Python itself using C++. 259 260 261.. _link-reqs: 262 263Compiling and Linking under Unix-like systems 264============================================= 265 266It is not necessarily trivial to find the right flags to pass to your 267compiler (and linker) in order to embed the Python interpreter into your 268application, particularly because Python needs to load library modules 269implemented as C dynamic extensions (:file:`.so` files) linked against 270it. 271 272To find out the required compiler and linker flags, you can execute the 273:file:`python{X.Y}-config` script which is generated as part of the 274installation process (a :file:`python-config` script may also be 275available). This script has several options, of which the following will 276be directly useful to you: 277 278* ``pythonX.Y-config --cflags`` will give you the recommended flags when 279 compiling: 280 281 .. code-block:: shell-session 282 283 $ /opt/bin/python2.7-config --cflags 284 -I/opt/include/python2.7 -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes 285 286* ``pythonX.Y-config --ldflags`` will give you the recommended flags when 287 linking: 288 289 .. code-block:: shell-session 290 291 $ /opt/bin/python2.7-config --ldflags 292 -L/opt/lib/python2.7/config -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic 293 294.. note:: 295 To avoid confusion between several Python installations (and especially 296 between the system Python and your own compiled Python), it is recommended 297 that you use the absolute path to :file:`python{X.Y}-config`, as in the above 298 example. 299 300If this procedure doesn't work for you (it is not guaranteed to work for 301all Unix-like platforms; however, we welcome :ref:`bug reports <reporting-bugs>`) 302you will have to read your system's documentation about dynamic linking and/or 303examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename` 304to find its location) and compilation 305options. In this case, the :mod:`sysconfig` module is a useful tool to 306programmatically extract the configuration values that you will want to 307combine together. For example: 308 309.. code-block:: python 310 311 >>> import sysconfig 312 >>> sysconfig.get_config_var('LIBS') 313 '-lpthread -ldl -lutil' 314 >>> sysconfig.get_config_var('LINKFORSHARED') 315 '-Xlinker -export-dynamic' 316 317 318.. XXX similar documentation for Windows missing 319