[GRASS-dev] rasteraccess.py Python error
glynn at gclements.plus.com
Mon Oct 12 15:34:08 EDT 2009
Martin Landa wrote:
> >> GRASS 7.0.svn (spearfish60):~ > python
> >> grass70/swig/python/examples/rasteraccess.py
> >> Raster Map Name? elevation.10m
> >> 0
> >> Traceback (most recent call last):
> >> File "grass70/swig/python/examples/rasteraccess.py", line 47, in <module>
> >> print rown, myrow[0:10]
> >> TypeError: 'int' object is unsubscriptable
> >> ?
> > Rast_get_row() returns an integer; if you want to print the first 10
> > values, use inrast[0:10].
> > A much older version of the SWIG interface assumed that a non-const
> > int/float/double pointer argument referred to a row buffer which was
> > filled in by the function, and would automatically allocate the buffer
> > and return it as the result. This failed for other cases, so the
> > feature was removed.
> right, anyway 'inrast' as a PySwigObject, not a list.
> Traceback (most recent call last):
> File "rasteraccess.py", line 47, in <module>
> print rown, inrast[0:10]
> TypeError: 'PySwigObject' object is unsubscriptable
inrast = array.array('i')
inrast.extend( * gis.G_window_cols())
This is a good example of one of SWIG's main limitations. The only
thing it knows about Rast_allocate_buf() is that it returns a void*;
there's no way that it can generate a usable Python object from that
(it doesn't know the actual element type or the number of elements).
In general, it's easier to create objects in Python and pass them to C
than the other way around.
The only real solution is to code wrappers by hand; a C prototype
simply doesn't contain enough information to create a wrapper in
anything beyond the simplest cases.
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev