[Python-Dev] buffer interface for C extensions

M.-A. Lemburg mal at egenix.com
Thu May 22 23:10:09 CEST 2008


On 2008-05-19 00:59, Dan Lenski wrote:
> Hi all,
> 
> I've written a small C extension to submit commands to SCSI devices via 
> Linux's sg_io driver (for a camera hacking project).  The extension is 
> just a wrapper around a couple ioctl()'s with Pythonic exception handling 
> thrown in.  One of my extension methods is called like this from python:
> 
> sg.write(fd, command[, data, timeout)
> 
> Both command and data are binary strings.  I would like to be able to use 
> either a regular Python string or an array('B', ...) for these read-only 
> arguments.  So I tried to use the "t#" argument specifier to indicate that 
> these arguments could be either strings or objects that implement the read-
> only buffer interface:
> 
> if (!PyArg_ParseTuple(args, "it#|t#i:write", &sg_fd, &cmd,
>                       &cmdLen, &buf, &bufLen, &timeout))
>     return NULL;
> 
> Now, this works fine with strings, but when I call it with an array I get 
> a TypeError:
> 
> TypeError: write() argument 2 must be string or read-only character 
> buffer, not array.array
> 
> So, I then tried changing "t#" to "w#" to indicate that the arguments must 
> implement the /read-write/ buffer interface.  Now the array objects work, 
> but when I try a string argument, I naturally get this error:
> 
> TypeError: Cannot use string as modifiable buffer
> 
> So here's what I don't understand.  Why doesn't the "t#" argument 
> specifier support read-write buffers as well as read-only buffers?  Aren't 
> read-write buffers a *superset* of read-only buffers??  Is there something 
> I'm doing wrong or a quick fix to get this to work appropriately?

You should probably ask such questions on the capi-sig list.

To answer your question:

t# requires support for the read-only 8-bit character buffer interface
s# can use the read buffer interface
w# requires support for the write buffer interface

Those are two different buffer interface slots, so whether a
particular object works with t# or w# depends on whether it
implements the slots in question.

You should probably try s#, as this will also work with objects
that implement the getreadbuffer slot.

The details can be found in Python/getargs.c

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, May 22 2008)
 >>> Python/Zope Consulting and Support ...        http://www.egenix.com/
 >>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
 >>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::


    eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
     D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
            Registered at Amtsgericht Duesseldorf: HRB 46611


More information about the Python-Dev mailing list