\section{Introduction} \label{sec:intro} \fpy is a command line tool that generates Python C/API modules for interfacing Fortran~77/90/95 codes and Fortran~90/95 modules from Python. In general, using \fpy an interface is produced in three steps: \begin{itemize} \item[(i)] \fpy scans Fortran sources and creates the so-called \emph{signature} file; the signature file contains the signatures of Fortran routines; the signatures are given in the free format of the Fortran~90/95 language specification. Latest version of \fpy generates also a make file for building shared module. About currently supported compilers see the \fpy home page \item[(ii)] Optionally, the signature files can be modified manually in order to dictate how the Fortran routines should be called or seemed from the Python environment. \item[(iii)] \fpy reads the signature files and generates Python C/API modules that can be compiled and imported to Python code. In addition, a LaTeX document is generated that contains the documentation of wrapped functions. \end{itemize} (Note that if you are satisfied with the default signature that \fpy generates in step (i), all three steps can be covered with just one call to \fpy --- by not specifying `\texttt{-h}' flag). Latest versions of \fpy support so-called \fpy directive that allows inserting various information about wrapping directly to Fortran source code as comments (\texttt{f2py }). The following diagram illustrates the usage of the tool: \begin{verbatim} ! Fortran file foo.f: subroutine foo(a) integer a a = a + 5 end \end{verbatim} \begin{verbatim} ! Fortran file bar.f: function bar(a,b) integer a,b,bar bar = a + b end \end{verbatim} \begin{itemize} \item[(i)] \shell{\fpy foo.f bar.f -m foobar -h foobar.pyf} \end{itemize} \begin{verbatim} !%f90 ! Signature file: foobar.pyf python module foobar ! in interface ! in :foobar subroutine foo(a) ! in :foobar:foo.f integer intent(inout) :: a end subroutine foo function bar(a,b) ! in :foobar:bar.f integer :: a integer :: b integer :: bar end function bar end interface end python module foobar \end{verbatim} \begin{itemize} \item[(ii)] Edit the signature file (here I made \texttt{foo}s argument \texttt{a} to be \texttt{intent(inout)}, see Sec.~\ref{sec:attributes}). \item[(iii)] \shell{\fpy foobar.pyf} \end{itemize} \begin{verbatim} /* Python C/API module: foobarmodule.c */ ... \end{verbatim} \begin{itemize} \item[(iv)] \shell{make -f Makefile-foobar} %\shell{gcc -shared -I/usr/include/python1.5/ foobarmodule.c\bs\\ %foo.f bar.f -o foobarmodule.so} \end{itemize} \begin{verbatim} Python shared module: foobarmodule.so \end{verbatim} \begin{itemize} \item[(v)] Usage in Python: \end{itemize} \vspace*{-4ex} \begin{verbatim} >>> import foobar >>> print foobar.__doc__ This module 'foobar' is auto-generated with f2py (version:1.174). The following functions are available: foo(a) bar = bar(a,b) . >>> print foobar.bar(2,3) 5 >>> from Numeric import * >>> a = array(3) >>> print a,foobar.foo(a),a 3 None 8 \end{verbatim} Information about how to call \fpy (steps (i) and (iii)) can be obtained by executing\\ \shell{\fpy}\\ This will print the usage instructions. Step (iv) is system dependent (compiler and the locations of the header files \texttt{Python.h} and \texttt{arrayobject.h}), and so you must know how to compile a shared module for Python in you system. The next Section describes the step (ii) in more detail in order to explain how you can influence to the process of interface generation so that the users can enjoy more writing Python programs using your wrappers that call Fortran routines. Step (v) is covered in Sec.~\ref{sec:notes}. \subsection{Features} \label{sec:features} \fpy has the following features: \begin{enumerate} \item \fpy scans real Fortran codes and produces the signature files. The syntax of the signature files is borrowed from the Fortran~90/95 language specification with some extensions. \item \fpy uses the signature files to produce the wrappers for Fortran~77 routines and their \texttt{COMMON} blocks. \item For \texttt{external} arguments \fpy constructs a very flexible call-back mechanism so that Python functions can be called from Fortran. \item You can pass in almost arbitrary Python objects to wrapper functions. If needed, \fpy takes care of type-casting and non-contiguous arrays. \item You can modify the signature files so that \fpy will generate wrapper functions with desired signatures. \texttt{depend()} attribute is introduced to control the initialization order of the variables. \fpy introduces \texttt{intent(hide)} attribute to remove the particular argument from the argument list of the wrapper function. In addition, \texttt{optional} and \texttt{required} attributes are introduced and employed. \item \fpy supports almost all standard Fortran~77/90/95 constructs and understands all basic Fortran types, including (multi-dimensional, complex) arrays and character strings with adjustable and assumed sizes/lengths. \item \fpy generates a LaTeX document containing the documentations of the wrapped functions (argument types, dimensions, etc). The user can easily add some human readable text to the documentation by inserting \texttt{note()} attribute to the definition of routine signatures. \item \fpy generates a GNU make file that can be used for building shared modules calling Fortran functions. \item \fpy supports wrapping Fortran 90/95 module routines. \end{enumerate} %%% Local Variables: %%% mode: latex %%% TeX-master: "f2py2e" %%% End: