Am 17.07.2012 18:55, schrieb Dag Sverre Seljebotn:
> Read PEP 3118. Then implement __getbuffer__ and __releasebuffer__ in
> your cdef class (don't know if it's documented but you can see example
> in tests/run/buffer.pyx).
The new buffer interface from PEP 3118 is only available for Python 2.6
and newer. I was hoping for some abstraction layer in Cython. Well, I
don't have to support Python 2.5 and older. Thanks for the hint!
> This is easily supported; above you would let
>
> ndim = 2
> strides = [8, 1]
> shape = [2, 3]
> itemsize = 1
>
> The alignment bytes are skipped simply because shape[0] * itemsize <
> strides[0].
Either I'm doing something wrong or I found a Cython bug. I've attached
two files. The output is unexpected and looks like something is
accessing uninitialized memory:
format BBB
itemsize 3
ndim 2
readonly True
shape (140704200676960L, 140704199917920L)
strides (2L, 140704196619665L)
suboffsets None
len 140704200677056
Cython: 0.16
Python: 2.7.3 on 64bit Linux
Christian
# buffertest.pyx
cimport cpython
cdef char *s = b"BGRBGRxxBGRBGRxxBGRBGRxx"
cdef class Buffertest:
def __getbuffer__(self, cpython.Py_buffer* buffer, int flags):
buffer.buf = <char*>s
buffer.obj = self
buffer.len = len(s)
buffer.readonly = 1
buffer.format = "BBB"
buffer.ndim = 2
buffer.shape = [3, 2]
buffer.strides = [8, 1]
buffer.suboffsets = NULL
buffer.itemsize = 3
buffer.internal = NULL
# setup.py
from Cython.Distutils import build_ext
from distutils.core import setup
from distutils.extension import Extension
setup_info = dict(
name="buffertest",
ext_modules=[
Extension("buffertest", ["buffertest.pyx"]),
],
cmdclass={"build_ext": build_ext},
)
setup(**setup_info)
import buffertest
buf = buffertest.Buffertest()
m = memoryview(buf)
for name in ('format', 'itemsize', 'ndim', 'readonly', 'shape', 'strides', 'suboffsets'):
print name, getattr(m, name)
print "len", len(m)
_______________________________________________
cython-devel mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cython-devel