\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:

\begin{verbatim}
    >>> import spam
    >>> status = spam.system("ls -l")
\end{verbatim}

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:

\begin{verbatim}
    #include "Python.h"
\end{verbatim}

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):

\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}

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.

\begin{verbatim}
    static PyObject *SpamError;
\end{verbatim}

and initialize it in your module's initialization function
(\code{initspam()}) with a string object, e.g. (leaving out the error
checking for now):

\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}

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:

\begin{verbatim}
        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;
\end{verbatim}

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()}:

\begin{verbatim}
        sts = system(command);
\end{verbatim}

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.

\begin{verbatim}
        return Py_BuildValue("i", sts);
\end{verbatim}

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:

\begin{verbatim}
        Py_INCREF(Py_None);
        return Py_None;
\end{verbatim}

\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'':

\begin{verbatim}
    static PyMethodDef SpamMethods[] = {
        ...
        {"system",  spam_system, 1},
        ...
        {NULL,      NULL}        /* Sentinel */
    };
\end{verbatim}

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):

\begin{verbatim}
    void
    initspam()
    {
        (void) Py_InitModule("spam", SpamMethods);
    }
\end{verbatim}

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:

\begin{verbatim}
    spam spammodule.o
\end{verbatim}

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:

\begin{verbatim}
    spam spammodule.o -lX11
\end{verbatim}


\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:

\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}

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:

\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}

\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:

\begin{verbatim}
    if (result == NULL)
        return NULL; /* Pass error back */
    ...use result...
    Py_DECREF(result); 
\end{verbatim}

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:

\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}

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:

\begin{verbatim}
    int PyArg_ParseTuple(PyObject *arg, char *format, ...);
\end{verbatim}

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:

\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}


\section{The {\tt Py_BuildValue()} Function}

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

\begin{verbatim}
    PyObject *Py_BuildValue(char *format, ...);
\end{verbatim}

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):

\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}


\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} 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:

\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}

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:

\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}

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:

\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}

\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
\begin{verbatim}
    ld spammodule.o -o spammodule.so
\end{verbatim}

On Solaris 2, use
\begin{verbatim}
    ld -G spammodule.o -o spammodule.so
\end{verbatim}

On SGI IRIX 5, use
\begin{verbatim}
    ld -shared spammodule.o -o spammodule.so
\end{verbatim}

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}
