blob: 6ba2c6736720f82278e13962e279f9ba5f2ecd2a [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"
Georg Brandl6911e3c2007-09-04 07:15:32 +000067 "print('Today is', ctime(time()))\n");
Georg Brandl116aa622007-08-15 14:28:22 +000068 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):
Georg Brandl6911e3c2007-09-04 07:15:32 +0000144 print("Will compute", a, "times", b)
Georg Brandl116aa622007-08-15 14:28:22 +0000145 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
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000158interesting part with respect to embedding Python starts with ::
Georg Brandl116aa622007-08-15 14:28:22 +0000159
160 Py_Initialize();
161 pName = PyString_FromString(argv[1]);
162 /* Error checking of pName left out */
163 pModule = PyImport_Import(pName);
164
165After initializing the interpreter, the script is loaded using
166:cfunc:`PyImport_Import`. This routine needs a Python string as its argument,
167which is constructed using the :cfunc:`PyString_FromString` data conversion
168routine. ::
169
170 pFunc = PyObject_GetAttrString(pModule, argv[2]);
171 /* pFunc is a new reference */
172
173 if (pFunc && PyCallable_Check(pFunc)) {
174 ...
175 }
176 Py_XDECREF(pFunc);
177
178Once the script is loaded, the name we're looking for is retrieved using
179:cfunc:`PyObject_GetAttrString`. If the name exists, and the object returned is
180callable, you can safely assume that it is a function. The program then
181proceeds by constructing a tuple of arguments as normal. The call to the Python
182function is then made with::
183
184 pValue = PyObject_CallObject(pFunc, pArgs);
185
186Upon return of the function, ``pValue`` is either *NULL* or it contains a
187reference to the return value of the function. Be sure to release the reference
188after examining the value.
189
190
191.. _extending-with-embedding:
192
193Extending Embedded Python
194=========================
195
196Until now, the embedded Python interpreter had no access to functionality from
197the application itself. The Python API allows this by extending the embedded
198interpreter. That is, the embedded interpreter gets extended with routines
199provided by the application. While it sounds complex, it is not so bad. Simply
200forget for a while that the application starts the Python interpreter. Instead,
201consider the application to be a set of subroutines, and write some glue code
202that gives Python access to those routines, just like you would write a normal
203Python extension. For example::
204
205 static int numargs=0;
206
207 /* Return the number of arguments of the application command line */
208 static PyObject*
209 emb_numargs(PyObject *self, PyObject *args)
210 {
211 if(!PyArg_ParseTuple(args, ":numargs"))
212 return NULL;
213 return Py_BuildValue("i", numargs);
214 }
215
216 static PyMethodDef EmbMethods[] = {
217 {"numargs", emb_numargs, METH_VARARGS,
218 "Return the number of arguments received by the process."},
219 {NULL, NULL, 0, NULL}
220 };
221
222Insert the above code just above the :cfunc:`main` function. Also, insert the
223following two statements directly after :cfunc:`Py_Initialize`::
224
225 numargs = argc;
226 Py_InitModule("emb", EmbMethods);
227
228These two lines initialize the ``numargs`` variable, and make the
229:func:`emb.numargs` function accessible to the embedded Python interpreter.
230With these extensions, the Python script can do things like ::
231
232 import emb
Georg Brandl6911e3c2007-09-04 07:15:32 +0000233 print("Number of arguments", emb.numargs())
Georg Brandl116aa622007-08-15 14:28:22 +0000234
235In a real application, the methods will expose an API of the application to
236Python.
237
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000238.. TODO: threads, code examples do not really behave well if errors happen
239 (what to watch out for)
Georg Brandl116aa622007-08-15 14:28:22 +0000240
241
242.. _embeddingincplusplus:
243
244Embedding Python in C++
245=======================
246
247It is also possible to embed Python in a C++ program; precisely how this is done
248will depend on the details of the C++ system used; in general you will need to
249write the main program in C++, and use the C++ compiler to compile and link your
250program. There is no need to recompile Python itself using C++.
251
252
253.. _link-reqs:
254
255Linking Requirements
256====================
257
258While the :program:`configure` script shipped with the Python sources will
259correctly build Python to export the symbols needed by dynamically linked
260extensions, this is not automatically inherited by applications which embed the
261Python library statically, at least on Unix. This is an issue when the
262application is linked to the static runtime library (:file:`libpython.a`) and
263needs to load dynamic extensions (implemented as :file:`.so` files).
264
265The problem is that some entry points are defined by the Python runtime solely
266for extension modules to use. If the embedding application does not use any of
267these entry points, some linkers will not include those entries in the symbol
268table of the finished executable. Some additional options are needed to inform
269the linker not to remove these symbols.
270
271Determining the right options to use for any given platform can be quite
272difficult, but fortunately the Python configuration already has those values.
273To retrieve them from an installed Python interpreter, start an interactive
274interpreter and have a short session like this::
275
276 >>> import distutils.sysconfig
277 >>> distutils.sysconfig.get_config_var('LINKFORSHARED')
278 '-Xlinker -export-dynamic'
279
280.. index:: module: distutils.sysconfig
281
282The contents of the string presented will be the options that should be used.
283If the string is empty, there's no need to add any additional options. The
284:const:`LINKFORSHARED` definition corresponds to the variable of the same name
285in Python's top-level :file:`Makefile`.
286