### Table Of Contents

- Advanced F2PY usages
  - Adding self-written functions to F2PY generated modules
  - Modifying the dictionary of a F2PY generated module

#### Previous topic

Using via `numpy.distutils`

#### Next topic

Contributing to Numpy

# Advanced F2PY usages

## Adding self-written functions to F2PY generated modules

Self-written Python C/API functions can be defined inside signature files using `usercode` and `pymethoddef` statements (they must be used inside the `python module` block). For example, the following signature file `spam.pyf`

    !    -*- f90 -*-
    python module spam
        usercode '''
      static char doc_spam_system[] = "Execute a shell command.";
      static PyObject *spam_system(PyObject *self, PyObject *args)
      {
        char *command;
        int sts;

        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;
        sts = system(command);
        return Py_BuildValue("i", sts);
      }
        '''
        pymethoddef '''
        {"system",  spam_system, METH_VARARGS, doc_spam_system},
        '''
    end python module spam

wraps the C library function `system()`:

    f2py -c spam.pyf

In Python:

    >>> import spam
    >>> status = spam.system('whoami')
    pearu
    >> status = spam.system('blah')
    sh: line 1: blah: command not found

## Modifying the dictionary of a F2PY generated module

The following example illustrates how to add an user-defined variables to a F2PY generated extension module. Given the following signature file

    !    -*- f90 -*-
    python module var
      usercode '''
        int BAR = 5;
      '''
      interface
        usercode '''
          PyDict_SetItemString(d,"BAR",PyInt_FromLong(BAR));
        '''
      end interface
    end python module

compile it as `f2py -c var.pyf`.

Notice that the second `usercode` statement must be defined inside an `interface` block and where the module dictionary is available through the variable `d` (see `f2py var.pyf`-generated `varmodule.c` for additional details).

In Python:

    >>> import var
    >>> var.BAR
    5