[Numpy-discussion] Complete and build the example from the "Using Numpy C-API" documentation.

Pauli Virtanen pav at iki.fi
Wed Jul 21 04:14:20 EDT 2010


Tue, 20 Jul 2010 18:04:42 -0500, Warren Weckesser wrote:
[clip]   
> I've made some progress, and now I'm getting a bus error. With the
> following extension module, calling example.foo results in a bus error,
> regardless of the arguments given.  The error occurs in the call to
> PyArg_ParseTuple.  I'm using same format string as in the example in the
> numpy docs, "O!".  Any ideas?
> 
> -----
> #include <stdio.h>
> #include "Python.h"
> #include "numpy/arrayobject.h"
> 
> static PyObject *foo_wrap(PyObject *dummy, PyObject *args) {
>     PyObject *arg1 = NULL;
> 
>     printf("boo\n");
>     if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &arg1)) {
>         printf("bad\n");
>         return NULL;
>     }
>     printf("here\n");
>     return Py_None;
> }

You need to INCREF the None return value (but that won't cause a crash 
here).

> static PyMethodDef wrappers[] = {
>     {"foo", foo_wrap, METH_VARARGS, "just a test"}, {NULL, NULL, 0,
>     NULL}        /* Sentinel */
> };
> 
> PyMODINIT_FUNC
> initexample(void)
> {
>     (void) Py_InitModule("example", wrappers);
> }

You need to call import_array(); in the init function. Otherwise, 
PyArray_Type probably won't be initialized. This can cause a crash.

-- 
Pauli Virtanen




More information about the NumPy-Discussion mailing list