| \section{\module{dl} --- |
| Call C functions in shared objects} |
| \declaremodule{extension}{dl} |
| \platform{Unix} %?????????? Anyone???????????? |
| \sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il} |
| \modulesynopsis{Call C functions in shared objects.} |
| |
| The \module{dl} module defines an interface to the |
| \cfunction{dlopen()} function, which is the most common interface on |
| \UNIX{} platforms for handling dynamically linked libraries. It allows |
| the program to call arbitrary functions in such a library. |
| |
| \strong{Note:} This module will not work unless |
| \begin{verbatim} |
| sizeof(int) == sizeof(long) == sizeof(char *) |
| \end{verbatim} |
| If this is not the case, \exception{SystemError} will be raised on |
| import. |
| |
| The \module{dl} module defines the following function: |
| |
| \begin{funcdesc}{open}{name\optional{, mode\code{ = RTLD_LAZY}}} |
| Open a shared object file, and return a handle. Mode |
| signifies late binding (\constant{RTLD_LAZY}) or immediate binding |
| (\constant{RTLD_NOW}). Default is \constant{RTLD_LAZY}. Note that some |
| systems do not support \constant{RTLD_NOW}. |
| |
| Return value is a \pytype{dlobject}. |
| \end{funcdesc} |
| |
| The \module{dl} module defines the following constants: |
| |
| \begin{datadesc}{RTLD_LAZY} |
| Useful as an argument to \function{open()}. |
| \end{datadesc} |
| |
| \begin{datadesc}{RTLD_NOW} |
| Useful as an argument to \function{open()}. Note that on systems |
| which do not support immediate binding, this constant will not appear |
| in the module. For maximum portability, use \function{hasattr()} to |
| determine if the system supports immediate binding. |
| \end{datadesc} |
| |
| The \module{dl} module defines the following exception: |
| |
| \begin{excdesc}{error} |
| Exception raised when an error has occurred inside the dynamic loading |
| and linking routines. |
| \end{excdesc} |
| |
| Example: |
| |
| \begin{verbatim} |
| >>> import dl, time |
| >>> a=dl.open('/lib/libc.so.6') |
| >>> a.call('time'), time.time() |
| (929723914, 929723914.498) |
| \end{verbatim} |
| |
| This example was tried on a Debian GNU/Linux system, and is a good |
| example of the fact that using this module is usually a bad alternative. |
| |
| \subsection{Dl Objects \label{dl-objects}} |
| |
| Dl objects, as returned by \function{open()} above, have the |
| following methods: |
| |
| \begin{methoddesc}{close}{} |
| Free all resources, except the memory. |
| \end{methoddesc} |
| |
| \begin{methoddesc}{sym}{name} |
| Return the pointer for the function named \var{name}, as a number, if |
| it exists in the referenced shared object, otherwise \code{None}. This |
| is useful in code like: |
| |
| \begin{verbatim} |
| >>> if a.sym('time'): |
| ... a.call('time') |
| ... else: |
| ... time.time() |
| \end{verbatim} |
| |
| (Note that this function will return a non-zero number, as zero is the |
| \NULL{} pointer) |
| \end{methoddesc} |
| |
| \begin{methoddesc}{call}{name\optional{, arg1\optional{, arg2\ldots}}} |
| Call the function named \var{name} in the referenced shared object. |
| The arguments must be either Python integers, which will be |
| passed as is, Python strings, to which a pointer will be passed, |
| or \code{None}, which will be passed as \NULL{}. Note that |
| strings should only be passed to functions as \ctype{const char*}, as |
| Python will not like its string mutated. |
| |
| There must be at most 10 arguments, and arguments not given will be |
| treated as \code{None}. The function's return value must be a C |
| \ctype{long}, which is a Python integer. |
| \end{methoddesc} |