\documentstyle[twoside,11pt,myformat]{report}

% XXX PM Modulator

\title{Extending and Embedding the Python Interpreter}

\input{boilerplate}

% Tell \index to actually write the .idx file
\makeindex

\begin{document}

\pagenumbering{roman}

\maketitle

\input{copyright}

\begin{abstract}

\noindent
Python is an interpreted, object-oriented programming language.  This
document describes how to write modules in C or \Cpp{} to extend the
Python interpreter with new modules.  Those modules can define new
functions but also new object types and their methods.  The document
also describes how to embed the Python interpreter in another
application, for use as an extension language.  Finally, it shows how
to compile and link extension modules so that they can be loaded
dynamically (at run time) into the interpreter, if the underlying
operating system supports this feature.

This document assumes basic knowledge about Python.  For an informal
introduction to the language, see the Python Tutorial.  The Python
Reference Manual gives a more formal definition of the language.  The
Python Library Reference documents the existing object types,
functions and modules (both built-in and written in Python) that give
the language its wide application range.

\end{abstract}

\pagebreak

{
\parskip = 0mm
\tableofcontents
}

\pagebreak

\pagenumbering{arabic}


\chapter{Extending Python with C or \Cpp{} code}


\section{Introduction}

It is quite easy to add new built-in modules to Python, if you know
how to program in C.  Such \dfn{extension modules} can do two things
that can't be done directly in Python: they can implement new built-in
object types, and they can call C library functions and system calls.

To support extensions, the Python API (Application Programmers
Interface) defines a set of functions, macros and variables that
provide access to most aspects of the Python run-time system.  The
Python API is incorporated in a C source file by including the header
\code{"Python.h"}.

The compilation of an extension module depends on its intended use as
well as on your system setup; details are given in a later section.


\section{A Simple Example}

Let's create an extension module called \samp{spam} (the favorite food
of Monty Python fans...) and let's say we want to create a Python
interface to the C library function \code{system()}.\footnote{An
interface for this function already exists in the standard module
\code{os} --- it was chosen as a simple and straightfoward example.}
This function takes a null-terminated character string as argument and
returns an integer.  We want this function to be callable from Python
as follows:

\bcode\begin{verbatim}
    >>> import spam
    >>> status = spam.system("ls -l")
\end{verbatim}\ecode
%
Begin by creating a file \samp{spammodule.c}.  (In general, if a
module is called \samp{spam}, the C file containing its implementation
is called \file{spammodule.c}; if the module name is very long, like
\samp{spammify}, the module name can be just \file{spammify.c}.)

The first line of our file can be:

\bcode\begin{verbatim}
    #include "Python.h"
\end{verbatim}\ecode
%
which pulls in the Python API (you can add a comment describing the
purpose of the module and a copyright notice if you like).

All user-visible symbols defined by \code{"Python.h"} have a prefix of
\samp{Py} or \samp{PY}, except those defined in standard header files.
For convenience, and since they are used extensively by the Python
interpreter, \code{"Python.h"} includes a few standard header files:
\code{<stdio.h>}, \code{<string.h>}, \code{<errno.h>}, and
\code{<stdlib.h>}.  If the latter header file does not exist on your
system, it declares the functions \code{malloc()}, \code{free()} and
\code{realloc()} directly.

The next thing we add to our module file is the C function that will
be called when the Python expression \samp{spam.system(\var{string})}
is evaluated (we'll see shortly how it ends up being called):

\bcode\begin{verbatim}
    static PyObject *
    spam_system(self, args)
        PyObject *self;
        PyObject *args;
    {
        char *command;
        int sts;
        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;
        sts = system(command);
        return Py_BuildValue("i", sts);
    }
\end{verbatim}\ecode
%
There is a straightforward translation from the argument list in
Python (e.g.\ the single expression \code{"ls -l"}) to the arguments
passed to the C function.  The C function always has two arguments,
conventionally named \var{self} and \var{args}.

The \var{self} argument is only used when the C function implements a
builtin method.  This will be discussed later. In the example,
\var{self} will always be a \code{NULL} pointer, since we are defining
a function, not a method.  (This is done so that the interpreter
doesn't have to understand two different types of C functions.)

The \var{args} argument will be a pointer to a Python tuple object
containing the arguments.  Each item of the tuple corresponds to an
argument in the call's argument list.  The arguments are Python
objects -- in order to do anything with them in our C function we have
to convert them to C values.  The function \code{PyArg_ParseTuple()}
in the Python API checks the argument types and converts them to C
values.  It uses a template string to determine the required types of
the arguments as well as the types of the C variables into which to
store the converted values.  More about this later.

\code{PyArg_ParseTuple()} returns true (nonzero) if all arguments have
the right type and its components have been stored in the variables
whose addresses are passed.  It returns false (zero) if an invalid
argument list was passed.  In the latter case it also raises an
appropriate exception by so the calling function can return
\code{NULL} immediately (as we saw in the example).


\section{Intermezzo: Errors and Exceptions}

An important convention throughout the Python interpreter is the
following: when a function fails, it should set an exception condition
and return an error value (usually a \code{NULL} pointer).  Exceptions
are stored in a static global variable inside the interpreter; if this
variable is \code{NULL} no exception has occurred.  A second global
variable stores the ``associated value'' of the exception (the second
argument to \code{raise}).  A third variable contains the stack
traceback in case the error originated in Python code.  These three
variables are the C equivalents of the Python variables
\code{sys.exc_type}, \code{sys.exc_value} and \code{sys.exc_traceback}
(see the section on module \code{sys} in the Library Reference
Manual).  It is important to know about them to understand how errors
are passed around.

The Python API defines a number of functions to set various types of
exceptions.

The most common one is \code{PyErr_SetString()}.  Its arguments are an
exception object and a C string.  The exception object is usually a
predefined object like \code{PyExc_ZeroDivisionError}.  The C string
indicates the cause of the error and is converted to a Python string
object and stored as the ``associated value'' of the exception.

Another useful function is \code{PyErr_SetFromErrno()}, which only
takes an exception argument and constructs the associated value by
inspection of the (\UNIX{}) global variable \code{errno}.  The most
general function is \code{PyErr_SetObject()}, which takes two object
arguments, the exception and its associated value.  You don't need to
\code{Py_INCREF()} the objects passed to any of these functions.

You can test non-destructively whether an exception has been set with
\code{PyErr_Occurred()}.  This returns the current exception object,
or \code{NULL} if no exception has occurred.  You normally don't need
to call \code{PyErr_Occurred()} to see whether an error occurred in a
function call, since you should be able to tell from the return value.

When a function \var{f} that calls another function \var{g} detects
that the latter fails, \var{f} should itself return an error value
(e.g. \code{NULL} or \code{-1}).  It should \emph{not} call one of the
\code{PyErr_*()} functions --- one has already been called by \var{g}.
\var{f}'s caller is then supposed to also return an error indication
to \emph{its} caller, again \emph{without} calling \code{PyErr_*()},
and so on --- the most detailed cause of the error was already
reported by the function that first detected it.  Once the error
reaches the Python interpreter's main loop, this aborts the currently
executing Python code and tries to find an exception handler specified
by the Python programmer.

(There are situations where a module can actually give a more detailed
error message by calling another \code{PyErr_*()} function, and in
such cases it is fine to do so.  As a general rule, however, this is
not necessary, and can cause information about the cause of the error
to be lost: most operations can fail for a variety of reasons.)

To ignore an exception set by a function call that failed, the exception
condition must be cleared explicitly by calling \code{PyErr_Clear()}. 
The only time C code should call \code{PyErr_Clear()} is if it doesn't
want to pass the error on to the interpreter but wants to handle it
completely by itself (e.g. by trying something else or pretending
nothing happened).

Note that a failing \code{malloc()} call must be turned into an
exception --- the direct caller of \code{malloc()} (or
\code{realloc()}) must call \code{PyErr_NoMemory()} and return a
failure indicator itself.  All the object-creating functions
(\code{PyInt_FromLong()} etc.) already do this, so only if you call
\code{malloc()} directly this note is of importance.

Also note that, with the important exception of
\code{PyArg_ParseTuple()} and friends, functions that return an
integer status usually return a positive value or zero for success and
\code{-1} for failure, like \UNIX{} system calls.

Finally, be careful to clean up garbage (by making \code{Py_XDECREF()}
or \code{Py_DECREF()} calls for objects you have already created) when
you return an error indicator!

The choice of which exception to raise is entirely yours.  There are
predeclared C objects corresponding to all built-in Python exceptions,
e.g. \code{PyExc_ZeroDevisionError} which you can use directly.  Of
course, you should choose exceptions wisely --- don't use
\code{PyExc_TypeError} to mean that a file couldn't be opened (that
should probably be \code{PyExc_IOError}).  If something's wrong with
the argument list, the \code{PyArg_ParseTuple()} function usually
raises \code{PyExc_TypeError}.  If you have an argument whose value
which must be in a particular range or must satisfy other conditions,
\code{PyExc_ValueError} is appropriate.

You can also define a new exception that is unique to your module.
For this, you usually declare a static object variable at the
beginning of your file, e.g.

\bcode\begin{verbatim}
    static PyObject *SpamError;
\end{verbatim}\ecode
%
and initialize it in your module's initialization function
(\code{initspam()}) with a string object, e.g. (leaving out the error
checking for now):

\bcode\begin{verbatim}
    void
    initspam()
    {
        PyObject *m, *d;
        m = Py_InitModule("spam", SpamMethods);
        d = PyModule_GetDict(m);
        SpamError = PyString_FromString("spam.error");
        PyDict_SetItemString(d, "error", SpamError);
    }
\end{verbatim}\ecode
%
Note that the Python name for the exception object is
\code{spam.error}.  It is conventional for module and exception names
to be spelled in lower case.  It is also conventional that the
\emph{value} of the exception object is the same as its name, e.g.\
the string \code{"spam.error"}.


\section{Back to the Example}

Going back to our example function, you should now be able to
understand this statement:

\bcode\begin{verbatim}
        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;
\end{verbatim}\ecode
%
It returns \code{NULL} (the error indicator for functions returning
object pointers) if an error is detected in the argument list, relying
on the exception set by \code{PyArg_ParseTuple()}.  Otherwise the
string value of the argument has been copied to the local variable
\code{command}.  This is a pointer assignment and you are not supposed
to modify the string to which it points (so in Standard C, the variable
\code{command} should properly be declared as \samp{const char
*command}).

The next statement is a call to the \UNIX{} function \code{system()},
passing it the string we just got from \code{PyArg_ParseTuple()}:

\bcode\begin{verbatim}
        sts = system(command);
\end{verbatim}\ecode
%
Our \code{spam.system()} function must return the value of \code{sts}
as a Python object.  This is done using the function
\code{Py_BuildValue()}, which is something like the inverse of
\code{PyArg_ParseTuple()}: it takes a format string and an arbitrary
number of C values, and returns a new Python object.  More info on
\code{Py_BuildValue()} is given later.

\bcode\begin{verbatim}
        return Py_BuildValue("i", sts);
\end{verbatim}\ecode
%
In this case, it will return an integer object.  (Yes, even integers
are objects on the heap in Python!)

If you have a C function that returns no useful argument (a function
returning \code{void}), the corresponding Python function must return
\code{None}.   You need this idiom to do so:

\bcode\begin{verbatim}
        Py_INCREF(Py_None);
        return Py_None;
\end{verbatim}\ecode
%
\code{Py_None} is the C name for the special Python object
\code{None}.  It is a genuine Python object (not a \code{NULL}
pointer, which means ``error'' in most contexts, as we have seen).


\section{The Module's Method Table and Initialization Function}

I promised to show how \code{spam_system()} is called from Python
programs.  First, we need to list its name and address in a ``method
table'':

\bcode\begin{verbatim}
    static PyMethodDef SpamMethods[] = {
        ...
        {"system",  spam_system, 1},
        ...
        {NULL,      NULL}        /* Sentinel */
    };
\end{verbatim}\ecode
%
Note the third entry (\samp{1}).  This is a flag telling the
interpreter the calling convention to be used for the C function.  It
should normally always be \samp{1}; a value of \samp{0} means that an
obsolete variant of \code{PyArg_ParseTuple()} is used.

The method table must be passed to the interpreter in the module's
initialization function (which should be the only non-\code{static}
item defined in the module file):

\bcode\begin{verbatim}
    void
    initspam()
    {
        (void) Py_InitModule("spam", SpamMethods);
    }
\end{verbatim}\ecode
%
When the Python program imports module \code{spam} for the first time,
\code{initspam()} is called.  It calls \code{Py_InitModule()}, which
creates a ``module object'' (which is inserted in the dictionary
\code{sys.modules} under the key \code{"spam"}), and inserts built-in
function objects into the newly created module based upon the table
(an array of \code{PyMethodDef} structures) that was passed as its
second argument.  \code{Py_InitModule()} returns a pointer to the
module object that it creates (which is unused here).  It aborts with
a fatal error if the module could not be initialized satisfactorily,
so the caller doesn't need to check for errors.


\section{Compilation and Linkage}

There are two more things to do before you can use your new extension:
compiling and linking it with the Python system.  If you use dynamic
loading, the details depend on the style of dynamic loading your
system uses; see the chapter on Dynamic Loading for more info about
this.

If you can't use dynamic loading, or if you want to make your module a
permanent part of the Python interpreter, you will have to change the
configuration setup and rebuild the interpreter.  Luckily, this is
very simple: just place your file (\file{spammodule.c} for example) in
the \file{Modules} directory, add a line to the file
\file{Modules/Setup} describing your file:

\bcode\begin{verbatim}
    spam spammodule.o
\end{verbatim}\ecode
%
and rebuild the interpreter by running \code{make} in the toplevel
directory.  You can also run \code{make} in the \file{Modules}
subdirectory, but then you must first rebuilt the \file{Makefile}
there by running \code{make Makefile}.  (This is necessary each time
you change the \file{Setup} file.)

If your module requires additional libraries to link with, these can
be listed on the line in the \file{Setup} file as well, for instance:

\bcode\begin{verbatim}
    spam spammodule.o -lX11
\end{verbatim}\ecode
%
\section{Calling Python Functions From C}

So far we have concentrated on making C functions callable from
Python.  The reverse is also useful: calling Python functions from C.
This is especially the case for libraries that support so-called
``callback'' functions.  If a C interface makes use of callbacks, the
equivalent Python often needs to provide a callback mechanism to the
Python programmer; the implementation will require calling the Python
callback functions from a C callback.  Other uses are also imaginable.

Fortunately, the Python interpreter is easily called recursively, and
there is a standard interface to call a Python function.  (I won't
dwell on how to call the Python parser with a particular string as
input --- if you're interested, have a look at the implementation of
the \samp{-c} command line option in \file{Python/pythonmain.c}.)

Calling a Python function is easy.  First, the Python program must
somehow pass you the Python function object.  You should provide a
function (or some other interface) to do this.  When this function is
called, save a pointer to the Python function object (be careful to
\code{Py_INCREF()} it!) in a global variable --- or whereever you see fit.
For example, the following function might be part of a module
definition:

\bcode\begin{verbatim}
    static PyObject *my_callback = NULL;

    static PyObject *
    my_set_callback(dummy, arg)
        PyObject *dummy, *arg;
    {
        Py_XDECREF(my_callback); /* Dispose of previous callback */
        Py_XINCREF(arg); /* Add a reference to new callback */
        my_callback = arg; /* Remember new callback */
        /* Boilerplate to return "None" */
        Py_INCREF(Py_None);
        return Py_None;
    }
\end{verbatim}\ecode
%
The macros \code{Py_XINCREF()} and \code{Py_XDECREF()} increment/decrement
the reference count of an object and are safe in the presence of
\code{NULL} pointers.  More info on them in the section on Reference
Counts below.

Later, when it is time to call the function, you call the C function
\code{PyEval_CallObject()}.  This function has two arguments, both
pointers to arbitrary Python objects: the Python function, and the
argument list.  The argument list must always be a tuple object, whose
length is the number of arguments.  To call the Python function with
no arguments, pass an empty tuple; to call it with one argument, pass
a singleton tuple.  \code{Py_BuildValue()} returns a tuple when its
format string consists of zero or more format codes between
parentheses.  For example:

\bcode\begin{verbatim}
    int arg;
    PyObject *arglist;
    PyObject *result;
    ...
    arg = 123;
    ...
    /* Time to call the callback */
    arglist = Py_BuildValue("(i)", arg);
    result = PyEval_CallObject(my_callback, arglist);
    Py_DECREF(arglist);
\end{verbatim}\ecode
%
\code{PyEval_CallObject()} returns a Python object pointer: this is
the return value of the Python function.  \code{PyEval_CallObject()} is
``reference-count-neutral'' with respect to its arguments.  In the
example a new tuple was created to serve as the argument list, which
is \code{Py_DECREF()}-ed immediately after the call.

The return value of \code{PyEval_CallObject()} is ``new'': either it
is a brand new object, or it is an existing object whose reference
count has been incremented.  So, unless you want to save it in a
global variable, you should somehow \code{Py_DECREF()} the result,
even (especially!) if you are not interested in its value.

Before you do this, however, it is important to check that the return
value isn't \code{NULL}.  If it is, the Python function terminated by raising
an exception.  If the C code that called \code{PyEval_CallObject()} is
called from Python, it should now return an error indication to its
Python caller, so the interpreter can print a stack trace, or the
calling Python code can handle the exception.  If this is not possible
or desirable, the exception should be cleared by calling
\code{PyErr_Clear()}.  For example:

\bcode\begin{verbatim}
    if (result == NULL)
        return NULL; /* Pass error back */
    ...use result...
    Py_DECREF(result); 
\end{verbatim}\ecode
%
Depending on the desired interface to the Python callback function,
you may also have to provide an argument list to \code{PyEval_CallObject()}.
In some cases the argument list is also provided by the Python
program, through the same interface that specified the callback
function.  It can then be saved and used in the same manner as the
function object.  In other cases, you may have to construct a new
tuple to pass as the argument list.  The simplest way to do this is to
call \code{Py_BuildValue()}.  For example, if you want to pass an integral
event code, you might use the following code:

\bcode\begin{verbatim}
    PyObject *arglist;
    ...
    arglist = Py_BuildValue("(l)", eventcode);
    result = PyEval_CallObject(my_callback, arglist);
    Py_DECREF(arglist);
    if (result == NULL)
        return NULL; /* Pass error back */
    /* Here maybe use the result */
    Py_DECREF(result);
\end{verbatim}\ecode
%
Note the placement of \code{Py_DECREF(argument)} immediately after the call,
before the error check!  Also note that strictly spoken this code is
not complete: \code{Py_BuildValue()} may run out of memory, and this should
be checked.


\section{Format Strings for {\tt PyArg_ParseTuple()}}

The \code{PyArg_ParseTuple()} function is declared as follows:

\bcode\begin{verbatim}
    int PyArg_ParseTuple(PyObject *arg, char *format, ...);
\end{verbatim}\ecode
%
The \var{arg} argument must be a tuple object containing an argument
list passed from Python to a C function.  The \var{format} argument
must be a format string, whose syntax is explained below.  The
remaining arguments must be addresses of variables whose type is
determined by the format string.  For the conversion to succeed, the
\var{arg} object must match the format and the format must be
exhausted.

Note that while \code{PyArg_ParseTuple()} checks that the Python
arguments have the required types, it cannot check the validity of the
addresses of C variables passed to the call: if you make mistakes
there, your code will probably crash or at least overwrite random bits
in memory.  So be careful!

A format string consists of zero or more ``format units''.  A format
unit describes one Python object; it is usually a single character or
a parenthesized sequence of format units.  With a few exceptions, a
format unit that is not a parenthesized sequence normally corresponds
to a single address argument to \code{PyArg_ParseTuple()}.  In the
following description, the quoted form is the format unit; the entry
in (round) parentheses is the Python object type that matches the
format unit; and the entry in [square] brackets is the type of the C
variable(s) whose address should be passed.  (Use the \samp{\&}
operator to pass a variable's address.)

\begin{description}

\item[\samp{s} (string) [char *]]
Convert a Python string to a C pointer to a character string.  You
must not provide storage for the string itself; a pointer to an
existing string is stored into the character pointer variable whose
address you pass.  The C string is null-terminated.  The Python string
must not contain embedded null bytes; if it does, a \code{TypeError}
exception is raised.

\item[\samp{s\#} (string) {[char *, int]}]
This variant on \code{'s'} stores into two C variables, the first one
a pointer to a character string, the second one its length.  In this
case the Python string may contain embedded null bytes.

\item[\samp{z} (string or \code{None}) {[char *]}]
Like \samp{s}, but the Python object may also be \code{None}, in which
case the C pointer is set to \code{NULL}.

\item[\samp{z\#} (string or \code{None}) {[char *, int]}]
This is to \code{'s\#'} as \code{'z'} is to \code{'s'}.

\item[\samp{b} (integer) {[char]}]
Convert a Python integer to a tiny int, stored in a C \code{char}.

\item[\samp{h} (integer) {[short int]}]
Convert a Python integer to a C \code{short int}.

\item[\samp{i} (integer) {[int]}]
Convert a Python integer to a plain C \code{int}.

\item[\samp{l} (integer) {[long int]}]
Convert a Python integer to a C \code{long int}.

\item[\samp{c} (string of length 1) {[char]}]
Convert a Python character, represented as a string of length 1, to a
C \code{char}.

\item[\samp{f} (float) {[float]}]
Convert a Python floating point number to a C \code{float}.

\item[\samp{d} (float) {[double]}]
Convert a Python floating point number to a C \code{double}.

\item[\samp{O} (object) {[PyObject *]}]
Store a Python object (without any conversion) in a C object pointer.
The C program thus receives the actual object that was passed.  The
object's reference count is not increased.  The pointer stored is not
\code{NULL}.

\item[\samp{O!} (object) {[\var{typeobject}, PyObject *]}]
Store a Python object in a C object pointer.  This is similar to
\samp{O}, but takes two C arguments: the first is the address of a
Python type object, the second is the address of the C variable (of
type \code{PyObject *}) into which the object pointer is stored.
If the Python object does not have the required type, a
\code{TypeError} exception is raised.

\item[\samp{O\&} (object) {[\var{converter}, \var{anything}]}]
Convert a Python object to a C variable through a \var{converter}
function.  This takes two arguments: the first is a function, the
second is the address of a C variable (of arbitrary type), converted
to \code{void *}.  The \var{converter} function in turn is called as
follows:

\code{\var{status} = \var{converter}(\var{object}, \var{address});}

where \var{object} is the Python object to be converted and
\var{address} is the \code{void *} argument that was passed to
\code{PyArg_ConvertTuple()}.  The returned \var{status} should be
\code{1} for a successful conversion and \code{0} if the conversion
has failed.  When the conversion fails, the \var{converter} function
should raise an exception.

\item[\samp{S} (string) {[PyStringObject *]}]
Like \samp{O} but raises a \code{TypeError} exception that the object
is a string object.  The C variable may also be declared as
\code{PyObject *}.

\item[\samp{(\var{items})} (tuple) {[\var{matching-items}]}]
The object must be a Python tuple whose length is the number of format
units in \var{items}.  The C arguments must correspond to the
individual format units in \var{items}.  Format units for tuples may
be nested.

\end{description}

It is possible to pass Python long integers where integers are
requested; however no proper range checking is done -- the most
significant bits are silently truncated when the receiving field is
too small to receive the value (actually, the semantics are inherited
from downcasts in C --- your milage may vary).

A few other characters have a meaning in a format string.  These may
not occur inside nested parentheses.  They are:

\begin{description}

\item[\samp{|}]
Indicates that the remaining arguments in the Python argument list are
optional.  The C variables corresponding to optional arguments should
be initialized to their default value --- when an optional argument is
not specified, the \code{PyArg_ParseTuple} does not touch the contents
of the corresponding C variable(s).

\item[\samp{:}]
The list of format units ends here; the string after the colon is used
as the function name in error messages (the ``associated value'' of
the exceptions that \code{PyArg_ParseTuple} raises).

\item[\samp{;}]
The list of format units ends here; the string after the colon is used
as the error message \emph{instead} of the default error message.
Clearly, \samp{:} and \samp{;} mutually exclude each other.

\end{description}

Some example calls:

\bcode\begin{verbatim}
    int ok;
    int i, j;
    long k, l;
    char *s;
    int size;

    ok = PyArg_ParseTuple(args, ""); /* No arguments */
        /* Python call: f() */
    
    ok = PyArg_ParseTuple(args, "s", &s); /* A string */
        /* Possible Python call: f('whoops!') */

    ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */
        /* Possible Python call: f(1, 2, 'three') */
    
    ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
        /* A pair of ints and a string, whose size is also returned */
        /* Possible Python call: f((1, 2), 'three') */

    {
        char *file;
        char *mode = "r";
        int bufsize = 0;
        ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
        /* A string, and optionally another string and an integer */
        /* Possible Python calls:
           f('spam')
           f('spam', 'w')
           f('spam', 'wb', 100000) */
    }

    {
        int left, top, right, bottom, h, v;
        ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)",
                 &left, &top, &right, &bottom, &h, &v);
                 /* A rectangle and a point */
                 /* Possible Python call:
                    f(((0, 0), (400, 300)), (10, 10)) */
    }
\end{verbatim}\ecode
%
\section{The {\tt Py_BuildValue()} Function}

This function is the counterpart to \code{PyArg_ParseTuple()}.  It is
declared as follows:

\bcode\begin{verbatim}
    PyObject *Py_BuildValue(char *format, ...);
\end{verbatim}\ecode
%
It recognizes a set of format units similar to the ones recognized by
\code{PyArg_ParseTuple()}, but the arguments (which are input to the
function, not output) must not be pointers, just values.  It returns a
new Python object, suitable for returning from a C function called
from Python.

One difference with \code{PyArg_ParseTuple()}: while the latter
requires its first argument to be a tuple (since Python argument lists
are always represented as tuples internally), \code{BuildValue()} does
not always build a tuple.  It builds a tuple only if its format string
contains two or more format units.  If the format string is empty, it
returns \code{None}; if it contains exactly one format unit, it
returns whatever object is described by that format unit.  To force it
to return a tuple of size 0 or one, parenthesize the format string.

In the following description, the quoted form is the format unit; the
entry in (round) parentheses is the Python object type that the format
unit will return; and the entry in [square] brackets is the type of
the C value(s) to be passed.

The characters space, tab, colon and comma are ignored in format
strings (but not within format units such as \samp{s\#}).  This can be
used to make long format strings a tad more readable.

\begin{description}

\item[\samp{s} (string) {[char *]}]
Convert a null-terminated C string to a Python object.  If the C
string pointer is \code{NULL}, \code{None} is returned.

\item[\samp{s\#} (string) {[char *, int]}]
Convert a C string and its length to a Python object.  If the C string
pointer is \code{NULL}, the length is ignored and \code{None} is
returned.

\item[\samp{z} (string or \code{None}) {[char *]}]
Same as \samp{s}.

\item[\samp{z\#} (string or \code{None}) {[char *, int]}]
Same as \samp{s\#}.

\item[\samp{i} (integer) {[int]}]
Convert a plain C \code{int} to a Python integer object.

\item[\samp{b} (integer) {[char]}]
Same as \samp{i}.

\item[\samp{h} (integer) {[short int]}]
Same as \samp{i}.

\item[\samp{l} (integer) {[long int]}]
Convert a C \code{long int} to a Python integer object.

\item[\samp{c} (string of length 1) {[char]}]
Convert a C \code{int} representing a character to a Python string of
length 1.

\item[\samp{d} (float) {[double]}]
Convert a C \code{double} to a Python floating point number.

\item[\samp{f} (float) {[float]}]
Same as \samp{d}.

\item[\samp{O} (object) {[PyObject *]}]
Pass a Python object untouched (except for its reference count, which
is incremented by one).  If the object passed in is a \code{NULL}
pointer, it is assumed that this was caused because the call producing
the argument found an error and set an exception.  Therefore,
\code{Py_BuildValue()} will return \code{NULL} but won't raise an
exception.  If no exception has been raised yet,
\code{PyExc_SystemError} is set.

\item[\samp{S} (object) {[PyObject *]}]
Same as \samp{O}.

\item[\samp{O\&} (object) {[\var{converter}, \var{anything}]}]
Convert \var{anything} to a Python object through a \var{converter}
function.  The function is called with \var{anything} (which should be
compatible with \code{void *}) as its argument and should return a
``new'' Python object, or \code{NULL} if an error occurred.

\item[\samp{(\var{items})} (tuple) {[\var{matching-items}]}]
Convert a sequence of C values to a Python tuple with the same number
of items.

\item[\samp{[\var{items}]} (list) {[\var{matching-items}]}]
Convert a sequence of C values to a Python list with the same number
of items.

\item[\samp{\{\var{items}\}} (dictionary) {[\var{matching-items}]}]
Convert a sequence of C values to a Python dictionary.  Each pair of
consecutive C values adds one item to the dictionary, serving as key
and value, respectively.

\end{description}

If there is an error in the format string, the
\code{PyExc_SystemError} exception is raised and \code{NULL} returned.

Examples (to the left the call, to the right the resulting Python value):

\bcode\begin{verbatim}
    Py_BuildValue("")                        None
    Py_BuildValue("i", 123)                  123
    Py_BuildValue("iii", 123, 456, 789)      (123, 456, 789)
    Py_BuildValue("s", "hello")              'hello'
    Py_BuildValue("ss", "hello", "world")    ('hello', 'world')
    Py_BuildValue("s#", "hello", 4)          'hell'
    Py_BuildValue("()")                      ()
    Py_BuildValue("(i)", 123)                (123,)
    Py_BuildValue("(ii)", 123, 456)          (123, 456)
    Py_BuildValue("(i,i)", 123, 456)         (123, 456)
    Py_BuildValue("[i,i]", 123, 456)         [123, 456]
    Py_BuildValue("{s:i,s:i}",
                  "abc", 123, "def", 456)    {'abc': 123, 'def': 456}
    Py_BuildValue("((ii)(ii)) (ii)",
                  1, 2, 3, 4, 5, 6)          (((1, 2), (3, 4)), (5, 6))
\end{verbatim}\ecode
%
\section{Reference Counts}

\subsection{Introduction}

In languages like C or \Cpp{}, the programmer is responsible for
dynamic allocation and deallocation of memory on the heap.  In C, this
is done using the functions \code{malloc()} and \code{free()}.  In
\Cpp{}, the operators \code{new} and \code{delete} are used with
essentially the same meaning; they are actually implemented using
\code{malloc()} and \code{free()}, so we'll restrict the following
discussion to the latter.

Every block of memory allocated with \code{malloc()} should eventually
be returned to the pool of available memory by exactly one call to
\code{free()}.  It is important to call \code{free()} at the right
time.  If a block's address is forgotten but \code{free()} is not
called for it, the memory it occupies cannot be reused until the
program terminates.  This is called a \dfn{memory leak}.  On the other
hand, if a program calls \code{free()} for a block and then continues
to use the block, it creates a conflict with re-use of the block
through another \code{malloc()} call.  This is called \dfn{using freed
memory}.  It has the same bad consequences as referencing uninitialized
data --- core dumps, wrong results, mysterious crashes.

Common causes of memory leaks are unusual paths through the code.  For
instance, a function may allocate a block of memory, do some
calculation, and then free the block again.  Now a change in the
requirements for the function may add a test to the calculation that
detects an error condition and can return prematurely from the
function.  It's easy to forget to free the allocated memory block when
taking this premature exit, especially when it is added later to the
code.  Such leaks, once introduced, often go undetected for a long
time: the error exit is taken only in a small fraction of all calls,
and most modern machines have plenty of virtual memory, so the leak
only becomes apparent in a long-running process that uses the leaking
function frequently.  Therefore, it's important to prevent leaks from
happening by having a coding convention or strategy that minimizes
this kind of errors.

Since Python makes heavy use of \code{malloc()} and \code{free()}, it
needs a strategy to avoid memory leaks as well as the use of freed
memory.  The chosen method is called \dfn{reference counting}.  The
principle is simple: every object contains a counter, which is
incremented when a reference to the object is stored somewhere, and
which is decremented when a reference to it is deleted.  When the
counter reaches zero, the last reference to the object has been
deleted and the object is freed.

An alternative strategy is called \dfn{automatic garbage collection}.
(Sometimes, reference counting is also referred to as a garbage
collection strategy, hence my use of ``automatic'' to distinguish the
two.)  The big advantage of automatic garbage collection is that the
user doesn't need to call \code{free()} explicitly.  (Another claimed
advantage is an improvement in speed or memory usage --- this is no
hard fact however.)  The disadvantage is that for C, there is no
truly portable automatic garbage collector, while reference counting
can be implemented portably (as long as the functions \code{malloc()}
and \code{free()} are available --- which the C Standard guarantees).
Maybe some day a sufficiently portable automatic garbage collector
will be available for C.  Until then, we'll have to live with
reference counts.

\subsection{Reference Counting in Python}

There are two macros, \code{Py_INCREF(x)} and \code{Py_DECREF(x)},
which handle the incrementing and decrementing of the reference count.
\code{Py_DECREF()} also frees the object when the count reaches zero.
For flexibility, it doesn't call \code{free()} directly --- rather, it
makes a call through a function pointer in the object's \dfn{type
object}.  For this purpose (and others), every object also contains a
pointer to its type object.

The big question now remains: when to use \code{Py_INCREF(x)} and
\code{Py_DECREF(x)}?  Let's first introduce some terms.  Nobody
``owns'' an object; however, you can \dfn{own a reference} to an
object.  An object's reference count is now defined as the number of
owned references to it.  The owner of a reference is responsible for
calling \code{Py_DECREF()} when the reference is no longer needed.
Ownership of a reference can be transferred.  There are three ways to
dispose of an owned reference: pass it on, store it, or call
\code{Py_DECREF()}.  Forgetting to dispose of an owned reference creates
a memory leak.

It is also possible to \dfn{borrow}\footnote{The metaphor of
``borrowing'' a reference is not completely correct: the owner still
has a copy of the reference.} a reference to an object.  The borrower
of a reference should not call \code{Py_DECREF()}.  The borrower must
not hold on to the object longer than the owner from which it was
borrowed.  Using a borrowed reference after the owner has disposed of
it risks using freed memory and should be avoided
completely.\footnote{Checking that the reference count is at least 1
\strong{does not work} --- the reference count itself could be in
freed memory and may thus be reused for another object!}

The advantage of borrowing over owning a reference is that you don't
need to take care of disposing of the reference on all possible paths
through the code --- in other words, with a borrowed reference you
don't run the risk of leaking when a premature exit is taken.  The
disadvantage of borrowing over leaking is that there are some subtle
situations where in seemingly correct code a borrowed reference can be
used after the owner from which it was borrowed has in fact disposed
of it.

A borrowed reference can be changed into an owned reference by calling
\code{Py_INCREF()}.  This does not affect the status of the owner from
which the reference was borrowed --- it creates a new owned reference,
and gives full owner responsibilities (i.e., the new owner must
dispose of the reference properly, as well as the previous owner).

\subsection{Ownership Rules}

Whenever an object reference is passed into or out of a function, it
is part of the function's interface specification whether ownership is
transferred with the reference or not.

Most functions that return a reference to an object pass on ownership
with the reference.  In particular, all functions whose function it is
to create a new object, e.g.\ \code{PyInt_FromLong()} and
\code{Py_BuildValue()}, pass ownership to the receiver.  Even if in
fact, in some cases, you don't receive a reference to a brand new
object, you still receive ownership of the reference.  For instance,
\code{PyInt_FromLong()} maintains a cache of popular values and can
return a reference to a cached item.

Many functions that extract objects from other objects also transfer
ownership with the reference, for instance
\code{PyObject_GetAttrString()}.  The picture is less clear, here,
however, since a few common routines are exceptions:
\code{PyTuple_GetItem()}, \code{PyList_GetItem()} and
\code{PyDict_GetItem()} (and \code{PyDict_GetItemString()}) all return
references that you borrow from the tuple, list or dictionary.

The function \code{PyImport_AddModule()} also returns a borrowed
reference, even though it may actually create the object it returns:
this is possible because an owned reference to the object is stored in
\code{sys.modules}.

When you pass an object reference into another function, in general,
the function borrows the reference from you --- if it needs to store
it, it will use \code{Py_INCREF()} to become an independent owner.
There are exactly two important exceptions to this rule:
\code{PyTuple_SetItem()} and \code{PyList_SetItem()}.  These functions
take over ownership of the item passed to them --- even if they fail!
(Note that \code{PyDict_SetItem()} and friends don't take over
ownership --- they are ``normal''.)

When a C function is called from Python, it borrows references to its
arguments from the caller.  The caller owns a reference to the object,
so the borrowed reference's lifetime is guaranteed until the function
returns.  Only when such a borrowed reference must be stored or passed
on, it must be turned into an owned reference by calling
\code{Py_INCREF()}.

The object reference returned from a C function that is called from
Python must be an owned reference --- ownership is tranferred from the
function to its caller.

\subsection{Thin Ice}

There are a few situations where seemingly harmless use of a borrowed
reference can lead to problems.  These all have to do with implicit
invocations of the interpreter, which can cause the owner of a
reference to dispose of it.

The first and most important case to know about is using
\code{Py_DECREF()} on an unrelated object while borrowing a reference
to a list item.  For instance:

\bcode\begin{verbatim}
bug(PyObject *list) {
    PyObject *item = PyList_GetItem(list, 0);
    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0); /* BUG! */
}
\end{verbatim}\ecode
%
This function first borrows a reference to \code{list[0]}, then
replaces \code{list[1]} with the value \code{0}, and finally prints
the borrowed reference.  Looks harmless, right?  But it's not!

Let's follow the control flow into \code{PyList_SetItem()}.  The list
owns references to all its items, so when item 1 is replaced, it has
to dispose of the original item 1.  Now let's suppose the original
item 1 was an instance of a user-defined class, and let's further
suppose that the class defined a \code{__del__()} method.  If this
class instance has a reference count of 1, disposing of it will call
its \code{__del__()} method.

Since it is written in Python, the \code{__del__()} method can execute
arbitrary Python code.  Could it perhaps do something to invalidate
the reference to \code{item} in \code{bug()}?  You bet!  Assuming that
the list passed into \code{bug()} is accessible to the
\code{__del__()} method, it could execute a statement to the effect of
\code{del list[0]}, and assuming this was the last reference to that
object, it would free the memory associated with it, thereby
invalidating \code{item}.

The solution, once you know the source of the problem, is easy:
temporarily increment the reference count.  The correct version of the
function reads:

\bcode\begin{verbatim}
no_bug(PyObject *list) {
    PyObject *item = PyList_GetItem(list, 0);
    Py_INCREF(item);
    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0);
    Py_DECREF(item);
}
\end{verbatim}\ecode
%
This is a true story.  An older version of Python contained variants
of this bug and someone spent a considerable amount of time in a C
debugger to figure out why his \code{__del__()} methods would fail...

The second case of problems with a borrowed reference is a variant
involving threads.  Normally, multiple threads in the Python
interpreter can't get in each other's way, because there is a global
lock protecting Python's entire object space.  However, it is possible
to temporarily release this lock using the macro
\code{Py_BEGIN_ALLOW_THREADS}, and to re-acquire it using
\code{Py_END_ALLOW_THREADS}.  This is common around blocking I/O
calls, to let other threads use the CPU while waiting for the I/O to
complete.  Obviously, the following function has the same problem as
the previous one:

\bcode\begin{verbatim}
bug(PyObject *list) {
    PyObject *item = PyList_GetItem(list, 0);
    Py_BEGIN_ALLOW_THREADS
    ...some blocking I/O call...
    Py_END_ALLOW_THREADS
    PyObject_Print(item, stdout, 0); /* BUG! */
}
\end{verbatim}\ecode
%
\subsection{NULL Pointers}

In general, functions that take object references as arguments don't
expect you to pass them \code{NULL} pointers, and will dump core (or
cause later core dumps) if you do so.  Functions that return object
references generally return \code{NULL} only to indicate that an
exception occurred.  The reason for not testing for \code{NULL}
arguments is that functions often pass the objects they receive on to
other function --- if each function were to test for \code{NULL},
there would be a lot of redundant tests and the code would run slower.

It is better to test for \code{NULL} only at the ``source'', i.e.\
when a pointer that may be \code{NULL} is received, e.g.\ from
\code{malloc()} or from a function that may raise an exception.

The macros \code{Py_INCREF()} and \code{Py_DECREF()}
don't check for \code{NULL} pointers --- however, their variants
\code{Py_XINCREF()} and \code{Py_XDECREF()} do.

The macros for checking for a particular object type
(\code{Py\var{type}_Check()}) don't check for \code{NULL} pointers ---
again, there is much code that calls several of these in a row to test
an object against various different expected types, and this would
generate redundant tests.  There are no variants with \code{NULL}
checking.

The C function calling mechanism guarantees that the argument list
passed to C functions (\code{args} in the examples) is never
\code{NULL} --- in fact it guarantees that it is always a tuple.%
\footnote{These guarantees don't hold when you use the ``old'' style
calling convention --- this is still found in much existing code.}

It is a severe error to ever let a \code{NULL} pointer ``escape'' to
the Python user.  


\section{Writing Extensions in \Cpp{}}

It is possible to write extension modules in \Cpp{}.  Some restrictions
apply.  If the main program (the Python interpreter) is compiled and
linked by the C compiler, global or static objects with constructors
cannot be used.  This is not a problem if the main program is linked
by the \Cpp{} compiler.  All functions that will be called directly or
indirectly (i.e. via function pointers) by the Python interpreter will
have to be declared using \code{extern "C"}; this applies to all
``methods'' as well as to the module's initialization function.
It is unnecessary to enclose the Python header files in
\code{extern "C" \{...\}} --- they use this form already if the symbol
\samp{__cplusplus} is defined (all recent C++ compilers define this
symbol).

\chapter{Embedding Python in another application}

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 \code{Py_Initialize()}.  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 \code{PyRun_SimpleString()},
or you can pass a stdio file pointer and a file name (for
identification in error messages only) to \code{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}.


\section{Embedding Python in \Cpp{}}

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


\chapter{Dynamic Loading}

On most modern systems it is possible to configure Python to support
dynamic loading of extension modules implemented in C.  When shared
libraries are used dynamic loading is configured automatically;
otherwise you have to select it as a build option (see below).  Once
configured, dynamic loading is trivial to use: when a Python program
executes \code{import spam}, the search for modules tries to find a
file \file{spammodule.o} (\file{spammodule.so} when using shared
libraries) in the module search path, and if one is found, it is
loaded into the executing binary and executed.  Once loaded, the
module acts just like a built-in extension module.

The advantages of dynamic loading are twofold: the ``core'' Python
binary gets smaller, and users can extend Python with their own
modules implemented in C without having to build and maintain their
own copy of the Python interpreter.  There are also disadvantages:
dynamic loading isn't available on all systems (this just means that
on some systems you have to use static loading), and dynamically
loading a module that was compiled for a different version of Python
(e.g. with a different representation of objects) may dump core.


\section{Configuring and Building the Interpreter for Dynamic Loading}

There are three styles of dynamic loading: one using shared libraries,
one using SGI IRIX 4 dynamic loading, and one using GNU dynamic
loading.

\subsection{Shared Libraries}

The following systems support dynamic loading using shared libraries:
SunOS 4; Solaris 2; SGI IRIX 5 (but not SGI IRIX 4!); and probably all
systems derived from SVR4, or at least those SVR4 derivatives that
support shared libraries (are there any that don't?).

You don't need to do anything to configure dynamic loading on these
systems --- the \file{configure} detects the presence of the
\file{<dlfcn.h>} header file and automatically configures dynamic
loading.

\subsection{SGI IRIX 4 Dynamic Loading}

Only SGI IRIX 4 supports dynamic loading of modules using SGI dynamic
loading.  (SGI IRIX 5 might also support it but it is inferior to
using shared libraries so there is no reason to; a small test didn't
work right away so I gave up trying to support it.)

Before you build Python, you first need to fetch and build the \code{dl}
package written by Jack Jansen.  This is available by anonymous ftp
from host \file{ftp.cwi.nl}, directory \file{pub/dynload}, file
\file{dl-1.6.tar.Z}.  (The version number may change.)  Follow the
instructions in the package's \file{README} file to build it.

Once you have built \code{dl}, you can configure Python to use it.  To
this end, you run the \file{configure} script with the option
\code{--with-dl=\var{directory}} where \var{directory} is the absolute
pathname of the \code{dl} directory.

Now build and install Python as you normally would (see the
\file{README} file in the toplevel Python directory.)

\subsection{GNU Dynamic Loading}

GNU dynamic loading supports (according to its \file{README} file) the
following hardware and software combinations: VAX (Ultrix), Sun 3
(SunOS 3.4 and 4.0), Sparc (SunOS 4.0), Sequent Symmetry (Dynix), and
Atari ST.  There is no reason to use it on a Sparc; I haven't seen a
Sun 3 for years so I don't know if these have shared libraries or not.

You need to fetch and build two packages.
One is GNU DLD.  All development of this code has been done with DLD
version 3.2.3, which is available by anonymous ftp from host
\file{ftp.cwi.nl}, directory \file{pub/dynload}, file
\file{dld-3.2.3.tar.Z}.  (A more recent version of DLD is available
via \file{http://www-swiss.ai.mit.edu/~jaffer/DLD.html} but this has
not been tested.)
The other package needed is an
emulation of Jack Jansen's \code{dl} package that I wrote on top of
GNU DLD 3.2.3.  This is available from the same host and directory,
file dl-dld-1.1.tar.Z.  (The version number may change --- but I doubt
it will.)  Follow the instructions in each package's \file{README}
file to configure build them.

Now configure Python.  Run the \file{configure} script with the option
\code{--with-dl-dld=\var{dl-directory},\var{dld-directory}} where
\var{dl-directory} is the absolute pathname of the directory where you
have built the \file{dl-dld} package, and \var{dld-directory} is that
of the GNU DLD package.  The Python interpreter you build hereafter
will support GNU dynamic loading.


\section{Building a Dynamically Loadable Module}

Since there are three styles of dynamic loading, there are also three
groups of instructions for building a dynamically loadable module.
Instructions common for all three styles are given first.  Assuming
your module is called \code{spam}, the source filename must be
\file{spammodule.c}, so the object name is \file{spammodule.o}.  The
module must be written as a normal Python extension module (as
described earlier).

Note that in all cases you will have to create your own Makefile that
compiles your module file(s).  This Makefile will have to pass two
\samp{-I} arguments to the C compiler which will make it find the
Python header files.  If the Make variable \var{PYTHONTOP} points to
the toplevel Python directory, your \var{CFLAGS} Make variable should
contain the options \samp{-I\$(PYTHONTOP) -I\$(PYTHONTOP)/Include}.
(Most header files are in the \file{Include} subdirectory, but the
\file{config.h} header lives in the toplevel directory.)


\subsection{Shared Libraries}

You must link the \samp{.o} file to produce a shared library.  This is
done using a special invocation of the \UNIX{} loader/linker, {\em
ld}(1).  Unfortunately the invocation differs slightly per system.

On SunOS 4, use
\bcode\begin{verbatim}
    ld spammodule.o -o spammodule.so
\end{verbatim}\ecode
%
On Solaris 2, use
\bcode\begin{verbatim}
    ld -G spammodule.o -o spammodule.so
\end{verbatim}\ecode
%
On SGI IRIX 5, use
\bcode\begin{verbatim}
    ld -shared spammodule.o -o spammodule.so
\end{verbatim}\ecode
%
On other systems, consult the manual page for \code{ld}(1) to find what
flags, if any, must be used.

If your extension module uses system libraries that haven't already
been linked with Python (e.g. a windowing system), these must be
passed to the \code{ld} command as \samp{-l} options after the
\samp{.o} file.

The resulting file \file{spammodule.so} must be copied into a directory
along the Python module search path.


\subsection{SGI IRIX 4 Dynamic Loading}

{\bf IMPORTANT:} You must compile your extension module with the
additional C flag \samp{-G0} (or \samp{-G 0}).  This instruct the
assembler to generate position-independent code.

You don't need to link the resulting \file{spammodule.o} file; just
copy it into a directory along the Python module search path.

The first time your extension is loaded, it takes some extra time and
a few messages may be printed.  This creates a file
\file{spammodule.ld} which is an image that can be loaded quickly into
the Python interpreter process.  When a new Python interpreter is
installed, the \code{dl} package detects this and rebuilds
\file{spammodule.ld}.  The file \file{spammodule.ld} is placed in the
directory where \file{spammodule.o} was found, unless this directory is
unwritable; in that case it is placed in a temporary
directory.\footnote{Check the manual page of the \code{dl} package for
details.}

If your extension modules uses additional system libraries, you must
create a file \file{spammodule.libs} in the same directory as the
\file{spammodule.o}.  This file should contain one or more lines with
whitespace-separated options that will be passed to the linker ---
normally only \samp{-l} options or absolute pathnames of libraries
(\samp{.a} files) should be used.


\subsection{GNU Dynamic Loading}

Just copy \file{spammodule.o} into a directory along the Python module
search path.

If your extension modules uses additional system libraries, you must
create a file \file{spammodule.libs} in the same directory as the
\file{spammodule.o}.  This file should contain one or more lines with
whitespace-separated absolute pathnames of libraries (\samp{.a}
files).  No \samp{-l} options can be used.


%\input{extref}

\input{ext.ind}

\end{document}
