Question: handling buffers of data in C extensions

Russell E. Owen owen at astrono.junkwashington.emu
Wed Jul 25 11:46:36 EDT 2001


In a C extension module, I am trying to implement a read function 
(something that passes back a buffer of data that Python should own and 
dispose of when it's ready to). I'm a bit confused about the best way to 
go about this.

I've appended what I have so far. I suspect it *might* work, but that 
there is a better way. My main concern is that PyString_AsString returns 
a null-terminated string, which is inappropriate and perhaps wrong; if 
the PyString is expecting the final buffer to be null-terminated I'm in 
trouble.

The documentation mentions buffer functions that sound much more 
appropriate, but I've not been able to figure out how they work. Any 
advice would be appreciated.

-- Russell

static PyObject *read (PyObject *self, PyObject *args)
{
    PyObject *py_edt_p;
    EdtDev *edt_p;
    int size;
    PyObject *py_buf_p;
    
    /* parse arguments */
    if (!PyArg_ParseTuple(args, "Ni", &py_edt_p, &size){
        return NULL;
    }
    edt_p = (EdtDev *) PyLong_AsVoidPtr(py_edt_p);
    if (edt_p == NULL{
        return NULL;
    }
    
    /* create a new Python string of the appropriate size
    and get a pointer to its internal buffer */
    py_buf_p = PyString_FromStringAndSize(NULL, size);
    buf_p = PyString_AsString(py_buf_p);
    
    /* fill the internal buffer and return the string */    
    if (0 != edt_read((EdtDev *) edt_p, buf_p, size){
        PyErr_SetString(PyExc_RuntimeError, edt_errStr);
        return NULL;
    }
    return py_buf_p;
}



More information about the Python-list mailing list