1======================= 2Extending/Embedding FAQ 3======================= 4 5.. only:: html 6 7 .. contents:: 8 9.. highlight:: c 10 11 12.. XXX need review for Python 3. 13 14 15Can I create my own functions in C? 16----------------------------------- 17 18Yes, you can create built-in modules containing functions, variables, exceptions 19and even new types in C. This is explained in the document 20:ref:`extending-index`. 21 22Most intermediate or advanced Python books will also cover this topic. 23 24 25Can I create my own functions in C++? 26------------------------------------- 27 28Yes, using the C compatibility features found in C++. Place ``extern "C" { 29... }`` around the Python include files and put ``extern "C"`` before each 30function that is going to be called by the Python interpreter. Global or static 31C++ objects with constructors are probably not a good idea. 32 33 34.. _c-wrapper-software: 35 36Writing C is hard; are there any alternatives? 37---------------------------------------------- 38 39There are a number of alternatives to writing your own C extensions, depending 40on what you're trying to do. 41 42.. XXX make sure these all work 43 44`Cython <http://cython.org>`_ and its relative `Pyrex 45<https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/>`_ are compilers 46that accept a slightly modified form of Python and generate the corresponding 47C code. Cython and Pyrex make it possible to write an extension without having 48to learn Python's C API. 49 50If you need to interface to some C or C++ library for which no Python extension 51currently exists, you can try wrapping the library's data types and functions 52with a tool such as `SWIG <http://www.swig.org>`_. `SIP 53<https://riverbankcomputing.com/software/sip/intro>`__, `CXX 54<http://cxx.sourceforge.net/>`_ `Boost 55<http://www.boost.org/libs/python/doc/index.html>`_, or `Weave 56<https://github.com/scipy/weave>`_ are also 57alternatives for wrapping C++ libraries. 58 59 60How can I execute arbitrary Python statements from C? 61----------------------------------------------------- 62 63The highest-level function to do this is :c:func:`PyRun_SimpleString` which takes 64a single string argument to be executed in the context of the module 65``__main__`` and returns ``0`` for success and ``-1`` when an exception occurred 66(including :exc:`SyntaxError`). If you want more control, use 67:c:func:`PyRun_String`; see the source for :c:func:`PyRun_SimpleString` in 68``Python/pythonrun.c``. 69 70 71How can I evaluate an arbitrary Python expression from C? 72--------------------------------------------------------- 73 74Call the function :c:func:`PyRun_String` from the previous question with the 75start symbol :c:data:`Py_eval_input`; it parses an expression, evaluates it and 76returns its value. 77 78 79How do I extract C values from a Python object? 80----------------------------------------------- 81 82That depends on the object's type. If it's a tuple, :c:func:`PyTuple_Size` 83returns its length and :c:func:`PyTuple_GetItem` returns the item at a specified 84index. Lists have similar functions, :c:func:`PyListSize` and 85:c:func:`PyList_GetItem`. 86 87For bytes, :c:func:`PyBytes_Size` returns its length and 88:c:func:`PyBytes_AsStringAndSize` provides a pointer to its value and its 89length. Note that Python bytes objects may contain null bytes so C's 90:c:func:`strlen` should not be used. 91 92To test the type of an object, first make sure it isn't ``NULL``, and then use 93:c:func:`PyBytes_Check`, :c:func:`PyTuple_Check`, :c:func:`PyList_Check`, etc. 94 95There is also a high-level API to Python objects which is provided by the 96so-called 'abstract' interface -- read ``Include/abstract.h`` for further 97details. It allows interfacing with any kind of Python sequence using calls 98like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc. as well 99as many other useful protocols such as numbers (:c:func:`PyNumber_Index` et 100al.) and mappings in the PyMapping APIs. 101 102 103How do I use Py_BuildValue() to create a tuple of arbitrary length? 104------------------------------------------------------------------- 105 106You can't. Use :c:func:`PyTuple_Pack` instead. 107 108 109How do I call an object's method from C? 110---------------------------------------- 111 112The :c:func:`PyObject_CallMethod` function can be used to call an arbitrary 113method of an object. The parameters are the object, the name of the method to 114call, a format string like that used with :c:func:`Py_BuildValue`, and the 115argument values:: 116 117 PyObject * 118 PyObject_CallMethod(PyObject *object, const char *method_name, 119 const char *arg_format, ...); 120 121This works for any object that has methods -- whether built-in or user-defined. 122You are responsible for eventually :c:func:`Py_DECREF`\ 'ing the return value. 123 124To call, e.g., a file object's "seek" method with arguments 10, 0 (assuming the 125file object pointer is "f"):: 126 127 res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0); 128 if (res == NULL) { 129 ... an exception occurred ... 130 } 131 else { 132 Py_DECREF(res); 133 } 134 135Note that since :c:func:`PyObject_CallObject` *always* wants a tuple for the 136argument list, to call a function without arguments, pass "()" for the format, 137and to call a function with one argument, surround the argument in parentheses, 138e.g. "(i)". 139 140 141How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)? 142---------------------------------------------------------------------------------------- 143 144In Python code, define an object that supports the ``write()`` method. Assign 145this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or 146just allow the standard traceback mechanism to work. Then, the output will go 147wherever your ``write()`` method sends it. 148 149The easiest way to do this is to use the :class:`io.StringIO` class: 150 151.. code-block:: pycon 152 153 >>> import io, sys 154 >>> sys.stdout = io.StringIO() 155 >>> print('foo') 156 >>> print('hello world!') 157 >>> sys.stderr.write(sys.stdout.getvalue()) 158 foo 159 hello world! 160 161A custom object to do the same would look like this: 162 163.. code-block:: pycon 164 165 >>> import io, sys 166 >>> class StdoutCatcher(io.TextIOBase): 167 ... def __init__(self): 168 ... self.data = [] 169 ... def write(self, stuff): 170 ... self.data.append(stuff) 171 ... 172 >>> import sys 173 >>> sys.stdout = StdoutCatcher() 174 >>> print('foo') 175 >>> print('hello world!') 176 >>> sys.stderr.write(''.join(sys.stdout.data)) 177 foo 178 hello world! 179 180 181How do I access a module written in Python from C? 182-------------------------------------------------- 183 184You can get a pointer to the module object as follows:: 185 186 module = PyImport_ImportModule("<modulename>"); 187 188If the module hasn't been imported yet (i.e. it is not yet present in 189:data:`sys.modules`), this initializes the module; otherwise it simply returns 190the value of ``sys.modules["<modulename>"]``. Note that it doesn't enter the 191module into any namespace -- it only ensures it has been initialized and is 192stored in :data:`sys.modules`. 193 194You can then access the module's attributes (i.e. any name defined in the 195module) as follows:: 196 197 attr = PyObject_GetAttrString(module, "<attrname>"); 198 199Calling :c:func:`PyObject_SetAttrString` to assign to variables in the module 200also works. 201 202 203How do I interface to C++ objects from Python? 204---------------------------------------------- 205 206Depending on your requirements, there are many approaches. To do this manually, 207begin by reading :ref:`the "Extending and Embedding" document 208<extending-index>`. Realize that for the Python run-time system, there isn't a 209whole lot of difference between C and C++ -- so the strategy of building a new 210Python type around a C structure (pointer) type will also work for C++ objects. 211 212For C++ libraries, see :ref:`c-wrapper-software`. 213 214 215I added a module using the Setup file and the make fails; why? 216-------------------------------------------------------------- 217 218Setup must end in a newline, if there is no newline there, the build process 219fails. (Fixing this requires some ugly shell script hackery, and this bug is so 220minor that it doesn't seem worth the effort.) 221 222 223How do I debug an extension? 224---------------------------- 225 226When using GDB with dynamically loaded extensions, you can't set a breakpoint in 227your extension until your extension is loaded. 228 229In your ``.gdbinit`` file (or interactively), add the command: 230 231.. code-block:: none 232 233 br _PyImport_LoadDynamicModule 234 235Then, when you run GDB: 236 237.. code-block:: shell-session 238 239 $ gdb /local/bin/python 240 gdb) run myscript.py 241 gdb) continue # repeat until your extension is loaded 242 gdb) finish # so that your extension is loaded 243 gdb) br myfunction.c:50 244 gdb) continue 245 246I want to compile a Python module on my Linux system, but some files are missing. Why? 247-------------------------------------------------------------------------------------- 248 249Most packaged versions of Python don't include the 250:file:`/usr/lib/python2.{x}/config/` directory, which contains various files 251required for compiling Python extensions. 252 253For Red Hat, install the python-devel RPM to get the necessary files. 254 255For Debian, run ``apt-get install python-dev``. 256 257 258How do I tell "incomplete input" from "invalid input"? 259------------------------------------------------------ 260 261Sometimes you want to emulate the Python interactive interpreter's behavior, 262where it gives you a continuation prompt when the input is incomplete (e.g. you 263typed the start of an "if" statement or you didn't close your parentheses or 264triple string quotes), but it gives you a syntax error message immediately when 265the input is invalid. 266 267In Python you can use the :mod:`codeop` module, which approximates the parser's 268behavior sufficiently. IDLE uses this, for example. 269 270The easiest way to do it in C is to call :c:func:`PyRun_InteractiveLoop` (perhaps 271in a separate thread) and let the Python interpreter handle the input for 272you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at your 273custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c`` 274for more hints. 275 276However sometimes you have to run the embedded Python interpreter in the same 277thread as your rest application and you can't allow the 278:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input. The one 279solution then is to call :c:func:`PyParser_ParseString` and test for ``e.error`` 280equal to ``E_EOF``, which means the input is incomplete. Here's a sample code 281fragment, untested, inspired by code from Alex Farber:: 282 283 #define PY_SSIZE_T_CLEAN 284 #include <Python.h> 285 #include <node.h> 286 #include <errcode.h> 287 #include <grammar.h> 288 #include <parsetok.h> 289 #include <compile.h> 290 291 int testcomplete(char *code) 292 /* code should end in \n */ 293 /* return -1 for error, 0 for incomplete, 1 for complete */ 294 { 295 node *n; 296 perrdetail e; 297 298 n = PyParser_ParseString(code, &_PyParser_Grammar, 299 Py_file_input, &e); 300 if (n == NULL) { 301 if (e.error == E_EOF) 302 return 0; 303 return -1; 304 } 305 306 PyNode_Free(n); 307 return 1; 308 } 309 310Another solution is trying to compile the received string with 311:c:func:`Py_CompileString`. If it compiles without errors, try to execute the 312returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the 313input for later. If the compilation fails, find out if it's an error or just 314more input is required - by extracting the message string from the exception 315tuple and comparing it to the string "unexpected EOF while parsing". Here is a 316complete example using the GNU readline library (you may want to ignore 317**SIGINT** while calling readline()):: 318 319 #include <stdio.h> 320 #include <readline.h> 321 322 #define PY_SSIZE_T_CLEAN 323 #include <Python.h> 324 #include <object.h> 325 #include <compile.h> 326 #include <eval.h> 327 328 int main (int argc, char* argv[]) 329 { 330 int i, j, done = 0; /* lengths of line, code */ 331 char ps1[] = ">>> "; 332 char ps2[] = "... "; 333 char *prompt = ps1; 334 char *msg, *line, *code = NULL; 335 PyObject *src, *glb, *loc; 336 PyObject *exc, *val, *trb, *obj, *dum; 337 338 Py_Initialize (); 339 loc = PyDict_New (); 340 glb = PyDict_New (); 341 PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ()); 342 343 while (!done) 344 { 345 line = readline (prompt); 346 347 if (NULL == line) /* Ctrl-D pressed */ 348 { 349 done = 1; 350 } 351 else 352 { 353 i = strlen (line); 354 355 if (i > 0) 356 add_history (line); /* save non-empty lines */ 357 358 if (NULL == code) /* nothing in code yet */ 359 j = 0; 360 else 361 j = strlen (code); 362 363 code = realloc (code, i + j + 2); 364 if (NULL == code) /* out of memory */ 365 exit (1); 366 367 if (0 == j) /* code was empty, so */ 368 code[0] = '\0'; /* keep strncat happy */ 369 370 strncat (code, line, i); /* append line to code */ 371 code[i + j] = '\n'; /* append '\n' to code */ 372 code[i + j + 1] = '\0'; 373 374 src = Py_CompileString (code, "<stdin>", Py_single_input); 375 376 if (NULL != src) /* compiled just fine - */ 377 { 378 if (ps1 == prompt || /* ">>> " or */ 379 '\n' == code[i + j - 1]) /* "... " and double '\n' */ 380 { /* so execute it */ 381 dum = PyEval_EvalCode (src, glb, loc); 382 Py_XDECREF (dum); 383 Py_XDECREF (src); 384 free (code); 385 code = NULL; 386 if (PyErr_Occurred ()) 387 PyErr_Print (); 388 prompt = ps1; 389 } 390 } /* syntax error or E_EOF? */ 391 else if (PyErr_ExceptionMatches (PyExc_SyntaxError)) 392 { 393 PyErr_Fetch (&exc, &val, &trb); /* clears exception! */ 394 395 if (PyArg_ParseTuple (val, "sO", &msg, &obj) && 396 !strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */ 397 { 398 Py_XDECREF (exc); 399 Py_XDECREF (val); 400 Py_XDECREF (trb); 401 prompt = ps2; 402 } 403 else /* some other syntax error */ 404 { 405 PyErr_Restore (exc, val, trb); 406 PyErr_Print (); 407 free (code); 408 code = NULL; 409 prompt = ps1; 410 } 411 } 412 else /* some non-syntax error */ 413 { 414 PyErr_Print (); 415 free (code); 416 code = NULL; 417 prompt = ps1; 418 } 419 420 free (line); 421 } 422 } 423 424 Py_XDECREF(glb); 425 Py_XDECREF(loc); 426 Py_Finalize(); 427 exit(0); 428 } 429 430 431How do I find undefined g++ symbols __builtin_new or __pure_virtual? 432-------------------------------------------------------------------- 433 434To dynamically load g++ extension modules, you must recompile Python, relink it 435using g++ (change LINKCC in the Python Modules Makefile), and link your 436extension module using g++ (e.g., ``g++ -shared -o mymodule.so mymodule.o``). 437 438 439Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)? 440---------------------------------------------------------------------------------------------------------------- 441 442Yes, you can inherit from built-in classes such as :class:`int`, :class:`list`, 443:class:`dict`, etc. 444 445The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html) 446provides a way of doing this from C++ (i.e. you can inherit from an extension 447class written in C++ using the BPL). 448