blob: b9a567c43b0aa26071e97d366c58630fd0476033 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001.. 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 :cfunc:`Py_Initialize` (on Mac OS,
29call :cfunc:`PyMac_Initialize` instead). There are optional calls to pass
30command line arguments to Python. Then later you can call the interpreter from
31any part of the application.
32
33There are several different ways to call the interpreter: you can pass a string
34containing Python statements to :cfunc:`PyRun_SimpleString`, or you can pass a
35stdio file pointer and a file name (for identification in error messages only)
36to :cfunc:`PyRun_SimpleFile`. You can also call the lower-level operations
37described in the previous chapters to construct and use Python objects.
38
39A simple demo of embedding Python can be found in the directory
40:file:`Demo/embed/` of the source distribution.
41
42
43.. seealso::
44
45 :ref:`c-api-index`
46 The details of Python's C interface are given in this manual. A great deal of
47 necessary information can be found here.
48
49
50.. _high-level-embedding:
51
52Very High Level Embedding
53=========================
54
55The simplest form of embedding Python is the use of the very high level
56interface. This interface is intended to execute a Python script without needing
57to interact with the application directly. This can for example be used to
58perform some operation on a file. ::
59
60 #include <Python.h>
61
62 int
63 main(int argc, char *argv[])
64 {
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 above code first initializes the Python interpreter with
73:cfunc:`Py_Initialize`, followed by the execution of a hard-coded Python script
74that print the date and time. Afterwards, the :cfunc:`Py_Finalize` call shuts
75the interpreter down, followed by the end of the program. In a real program,
76you may want to get the Python script from another source, perhaps a text-editor
77routine, a file, or a database. Getting the Python code from a file can better
78be done by using the :cfunc:`PyRun_SimpleFile` function, which saves you the
79trouble of allocating memory space and loading the file contents.
80
81
82.. _lower-level-embedding:
83
84Beyond Very High Level Embedding: An overview
85=============================================
86
87The high level interface gives you the ability to execute arbitrary pieces of
88Python code from your application, but exchanging data values is quite
89cumbersome to say the least. If you want that, you should use lower level calls.
90At the cost of having to write more C code, you can achieve almost anything.
91
92It should be noted that extending Python and embedding Python is quite the same
93activity, despite the different intent. Most topics discussed in the previous
94chapters are still valid. To show this, consider what the extension code from
95Python to C really does:
96
97#. Convert data values from Python to C,
98
99#. Perform a function call to a C routine using the converted values, and
100
101#. Convert the data values from the call from C to Python.
102
103When embedding Python, the interface code does:
104
105#. Convert data values from C to Python,
106
107#. Perform a function call to a Python interface routine using the converted
108 values, and
109
110#. Convert the data values from the call from Python to C.
111
112As you can see, the data conversion steps are simply swapped to accommodate the
113different direction of the cross-language transfer. The only difference is the
114routine that you call between both data conversions. When extending, you call a
115C routine, when embedding, you call a Python routine.
116
117This chapter will not discuss how to convert data from Python to C and vice
118versa. Also, proper use of references and dealing with errors is assumed to be
119understood. Since these aspects do not differ from extending the interpreter,
120you can refer to earlier chapters for the required information.
121
122
123.. _pure-embedding:
124
125Pure Embedding
126==============
127
128The first program aims to execute a function in a Python script. Like in the
129section about the very high level interface, the Python interpreter does not
130directly interact with the application (but that will change in the next
131section).
132
133The code to run a function defined in a Python script is:
134
135.. literalinclude:: ../includes/run-func.c
136
137
138This code loads a Python script using ``argv[1]``, and calls the function named
139in ``argv[2]``. Its integer arguments are the other values of the ``argv``
140array. If you compile and link this program (let's call the finished executable
141:program:`call`), and use it to execute a Python script, such as::
142
143 def multiply(a,b):
144 print "Will compute", a, "times", b
145 c = 0
146 for i in range(0, a):
147 c = c + b
148 return c
149
150then the result should be::
151
152 $ call multiply multiply 3 2
153 Will compute 3 times 2
154 Result of call: 6
155
156Although the program is quite large for its functionality, most of the code is
157for data conversion between Python and C, and for error reporting. The
158interesting part with respect to embedding Python starts with
159
160.. % $
161
162::
163
164 Py_Initialize();
165 pName = PyString_FromString(argv[1]);
166 /* Error checking of pName left out */
167 pModule = PyImport_Import(pName);
168
169After initializing the interpreter, the script is loaded using
170:cfunc:`PyImport_Import`. This routine needs a Python string as its argument,
171which is constructed using the :cfunc:`PyString_FromString` data conversion
172routine. ::
173
174 pFunc = PyObject_GetAttrString(pModule, argv[2]);
175 /* pFunc is a new reference */
176
177 if (pFunc && PyCallable_Check(pFunc)) {
178 ...
179 }
180 Py_XDECREF(pFunc);
181
182Once the script is loaded, the name we're looking for is retrieved using
183:cfunc:`PyObject_GetAttrString`. If the name exists, and the object returned is
184callable, you can safely assume that it is a function. The program then
185proceeds by constructing a tuple of arguments as normal. The call to the Python
186function is then made with::
187
188 pValue = PyObject_CallObject(pFunc, pArgs);
189
190Upon return of the function, ``pValue`` is either *NULL* or it contains a
191reference to the return value of the function. Be sure to release the reference
192after examining the value.
193
194
195.. _extending-with-embedding:
196
197Extending Embedded Python
198=========================
199
200Until now, the embedded Python interpreter had no access to functionality from
201the application itself. The Python API allows this by extending the embedded
202interpreter. That is, the embedded interpreter gets extended with routines
203provided by the application. While it sounds complex, it is not so bad. Simply
204forget for a while that the application starts the Python interpreter. Instead,
205consider the application to be a set of subroutines, and write some glue code
206that gives Python access to those routines, just like you would write a normal
207Python extension. For example::
208
209 static int numargs=0;
210
211 /* Return the number of arguments of the application command line */
212 static PyObject*
213 emb_numargs(PyObject *self, PyObject *args)
214 {
215 if(!PyArg_ParseTuple(args, ":numargs"))
216 return NULL;
217 return Py_BuildValue("i", numargs);
218 }
219
220 static PyMethodDef EmbMethods[] = {
221 {"numargs", emb_numargs, METH_VARARGS,
222 "Return the number of arguments received by the process."},
223 {NULL, NULL, 0, NULL}
224 };
225
226Insert the above code just above the :cfunc:`main` function. Also, insert the
227following two statements directly after :cfunc:`Py_Initialize`::
228
229 numargs = argc;
230 Py_InitModule("emb", EmbMethods);
231
232These two lines initialize the ``numargs`` variable, and make the
233:func:`emb.numargs` function accessible to the embedded Python interpreter.
234With these extensions, the Python script can do things like ::
235
236 import emb
237 print "Number of arguments", emb.numargs()
238
239In a real application, the methods will expose an API of the application to
240Python.
241
242.. % \section{For the future}
243.. %
244.. % You don't happen to have a nice library to get textual
245.. % equivalents of numeric values do you :-) ?
246.. % Callbacks here ? (I may be using information from that section
247.. % ?!)
248.. % threads
249.. % code examples do not really behave well if errors happen
250.. % (what to watch out for)
251
252
253.. _embeddingincplusplus:
254
255Embedding Python in C++
256=======================
257
258It is also possible to embed Python in a C++ program; precisely how this is done
259will depend on the details of the C++ system used; in general you will need to
260write the main program in C++, and use the C++ compiler to compile and link your
261program. There is no need to recompile Python itself using C++.
262
263
264.. _link-reqs:
265
266Linking Requirements
267====================
268
269While the :program:`configure` script shipped with the Python sources will
270correctly build Python to export the symbols needed by dynamically linked
271extensions, this is not automatically inherited by applications which embed the
272Python library statically, at least on Unix. This is an issue when the
273application is linked to the static runtime library (:file:`libpython.a`) and
274needs to load dynamic extensions (implemented as :file:`.so` files).
275
276The problem is that some entry points are defined by the Python runtime solely
277for extension modules to use. If the embedding application does not use any of
278these entry points, some linkers will not include those entries in the symbol
279table of the finished executable. Some additional options are needed to inform
280the linker not to remove these symbols.
281
282Determining the right options to use for any given platform can be quite
283difficult, but fortunately the Python configuration already has those values.
284To retrieve them from an installed Python interpreter, start an interactive
285interpreter and have a short session like this::
286
287 >>> import distutils.sysconfig
288 >>> distutils.sysconfig.get_config_var('LINKFORSHARED')
289 '-Xlinker -export-dynamic'
290
291.. index:: module: distutils.sysconfig
292
293The contents of the string presented will be the options that should be used.
294If the string is empty, there's no need to add any additional options. The
295:const:`LINKFORSHARED` definition corresponds to the variable of the same name
296in Python's top-level :file:`Makefile`.
297