I promised to show how spam_system()
is called from Python
programs. First, we need to list its name and address in a ``method
table'':
static PyMethodDef SpamMethods[] = { ... {"system", spam_system, 1}, ... {NULL, NULL} /* Sentinel */ };
Note the third entry (`1'). This is a flag telling the
interpreter the calling convention to be used for the C function. It
should normally always be `1'; a value of `0' means that an
obsolete variant of 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-static
item defined in the module file):
void initspam() { (void) Py_InitModule("spam", SpamMethods); }
When the Python program imports module spam
for the first time,
initspam()
is called. It calls Py_InitModule()
, which
creates a ``module object'' (which is inserted in the dictionary
sys.modules
under the key "spam"
), and inserts built-in
function objects into the newly created module based upon the table
(an array of PyMethodDef
structures) that was passed as its
second argument. 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.