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
usercode
pymethoddef
python module
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():
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
The following example illustrates how to add a 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.
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).
interface
d
f2py var.pyf
varmodule.c
>>> import var >>> var.BAR 5