• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. highlight:: c
2
3.. index::
4   single: buffer protocol
5   single: buffer interface; (see buffer protocol)
6   single: buffer object; (see buffer protocol)
7
8.. _bufferobjects:
9
10Buffer Protocol
11---------------
12
13.. sectionauthor:: Greg Stein <gstein@lyra.org>
14.. sectionauthor:: Benjamin Peterson
15.. sectionauthor:: Stefan Krah
16
17
18Certain objects available in Python wrap access to an underlying memory
19array or *buffer*.  Such objects include the built-in :class:`bytes` and
20:class:`bytearray`, and some extension types like :class:`array.array`.
21Third-party libraries may define their own types for special purposes, such
22as image processing or numeric analysis.
23
24While each of these types have their own semantics, they share the common
25characteristic of being backed by a possibly large memory buffer.  It is
26then desirable, in some situations, to access that buffer directly and
27without intermediate copying.
28
29Python provides such a facility at the C level in the form of the :ref:`buffer
30protocol <bufferobjects>`.  This protocol has two sides:
31
32.. index:: single: PyBufferProcs
33
34- on the producer side, a type can export a "buffer interface" which allows
35  objects of that type to expose information about their underlying buffer.
36  This interface is described in the section :ref:`buffer-structs`;
37
38- on the consumer side, several means are available to obtain a pointer to
39  the raw underlying data of an object (for example a method parameter).
40
41Simple objects such as :class:`bytes` and :class:`bytearray` expose their
42underlying buffer in byte-oriented form.  Other forms are possible; for example,
43the elements exposed by an :class:`array.array` can be multi-byte values.
44
45An example consumer of the buffer interface is the :meth:`~io.BufferedIOBase.write`
46method of file objects: any object that can export a series of bytes through
47the buffer interface can be written to a file.  While :meth:`write` only
48needs read-only access to the internal contents of the object passed to it,
49other methods such as :meth:`~io.BufferedIOBase.readinto` need write access
50to the contents of their argument.  The buffer interface allows objects to
51selectively allow or reject exporting of read-write and read-only buffers.
52
53There are two ways for a consumer of the buffer interface to acquire a buffer
54over a target object:
55
56* call :c:func:`PyObject_GetBuffer` with the right parameters;
57
58* call :c:func:`PyArg_ParseTuple` (or one of its siblings) with one of the
59  ``y*``, ``w*`` or ``s*`` :ref:`format codes <arg-parsing>`.
60
61In both cases, :c:func:`PyBuffer_Release` must be called when the buffer
62isn't needed anymore.  Failure to do so could lead to various issues such as
63resource leaks.
64
65
66.. _buffer-structure:
67
68Buffer structure
69================
70
71Buffer structures (or simply "buffers") are useful as a way to expose the
72binary data from another object to the Python programmer.  They can also be
73used as a zero-copy slicing mechanism.  Using their ability to reference a
74block of memory, it is possible to expose any data to the Python programmer
75quite easily.  The memory could be a large, constant array in a C extension,
76it could be a raw block of memory for manipulation before passing to an
77operating system library, or it could be used to pass around structured data
78in its native, in-memory format.
79
80Contrary to most data types exposed by the Python interpreter, buffers
81are not :c:type:`PyObject` pointers but rather simple C structures.  This
82allows them to be created and copied very simply.  When a generic wrapper
83around a buffer is needed, a :ref:`memoryview <memoryview-objects>` object
84can be created.
85
86For short instructions how to write an exporting object, see
87:ref:`Buffer Object Structures <buffer-structs>`. For obtaining
88a buffer, see :c:func:`PyObject_GetBuffer`.
89
90.. c:type:: Py_buffer
91
92   .. c:member:: void *buf
93
94      A pointer to the start of the logical structure described by the buffer
95      fields. This can be any location within the underlying physical memory
96      block of the exporter. For example, with negative :c:member:`~Py_buffer.strides`
97      the value may point to the end of the memory block.
98
99      For :term:`contiguous` arrays, the value points to the beginning of
100      the memory block.
101
102   .. c:member:: void *obj
103
104      A new reference to the exporting object. The reference is owned by
105      the consumer and automatically decremented and set to ``NULL`` by
106      :c:func:`PyBuffer_Release`. The field is the equivalent of the return
107      value of any standard C-API function.
108
109      As a special case, for *temporary* buffers that are wrapped by
110      :c:func:`PyMemoryView_FromBuffer` or :c:func:`PyBuffer_FillInfo`
111      this field is ``NULL``. In general, exporting objects MUST NOT
112      use this scheme.
113
114   .. c:member:: Py_ssize_t len
115
116      ``product(shape) * itemsize``. For contiguous arrays, this is the length
117      of the underlying memory block. For non-contiguous arrays, it is the length
118      that the logical structure would have if it were copied to a contiguous
119      representation.
120
121      Accessing ``((char *)buf)[0] up to ((char *)buf)[len-1]`` is only valid
122      if the buffer has been obtained by a request that guarantees contiguity. In
123      most cases such a request will be :c:macro:`PyBUF_SIMPLE` or :c:macro:`PyBUF_WRITABLE`.
124
125   .. c:member:: int readonly
126
127      An indicator of whether the buffer is read-only. This field is controlled
128      by the :c:macro:`PyBUF_WRITABLE` flag.
129
130   .. c:member:: Py_ssize_t itemsize
131
132      Item size in bytes of a single element. Same as the value of :func:`struct.calcsize`
133      called on non-``NULL`` :c:member:`~Py_buffer.format` values.
134
135      Important exception: If a consumer requests a buffer without the
136      :c:macro:`PyBUF_FORMAT` flag, :c:member:`~Py_buffer.format` will
137      be set to  ``NULL``,  but :c:member:`~Py_buffer.itemsize` still has
138      the value for the original format.
139
140      If :c:member:`~Py_buffer.shape` is present, the equality
141      ``product(shape) * itemsize == len`` still holds and the consumer
142      can use :c:member:`~Py_buffer.itemsize` to navigate the buffer.
143
144      If :c:member:`~Py_buffer.shape` is ``NULL`` as a result of a :c:macro:`PyBUF_SIMPLE`
145      or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard
146      :c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``.
147
148   .. c:member:: const char *format
149
150      A *NUL* terminated string in :mod:`struct` module style syntax describing
151      the contents of a single item. If this is ``NULL``, ``"B"`` (unsigned bytes)
152      is assumed.
153
154      This field is controlled by the :c:macro:`PyBUF_FORMAT` flag.
155
156   .. c:member:: int ndim
157
158      The number of dimensions the memory represents as an n-dimensional array.
159      If it is ``0``, :c:member:`~Py_buffer.buf` points to a single item representing
160      a scalar. In this case, :c:member:`~Py_buffer.shape`, :c:member:`~Py_buffer.strides`
161      and :c:member:`~Py_buffer.suboffsets` MUST be ``NULL``.
162
163      The macro :c:macro:`PyBUF_MAX_NDIM` limits the maximum number of dimensions
164      to 64. Exporters MUST respect this limit, consumers of multi-dimensional
165      buffers SHOULD be able to handle up to :c:macro:`PyBUF_MAX_NDIM` dimensions.
166
167   .. c:member:: Py_ssize_t *shape
168
169      An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
170      indicating the shape of the memory as an n-dimensional array. Note that
171      ``shape[0] * ... * shape[ndim-1] * itemsize`` MUST be equal to
172      :c:member:`~Py_buffer.len`.
173
174      Shape values are restricted to ``shape[n] >= 0``. The case
175      ``shape[n] == 0`` requires special attention. See `complex arrays`_
176      for further information.
177
178      The shape array is read-only for the consumer.
179
180   .. c:member:: Py_ssize_t *strides
181
182      An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
183      giving the number of bytes to skip to get to a new element in each
184      dimension.
185
186      Stride values can be any integer. For regular arrays, strides are
187      usually positive, but a consumer MUST be able to handle the case
188      ``strides[n] <= 0``. See `complex arrays`_ for further information.
189
190      The strides array is read-only for the consumer.
191
192   .. c:member:: Py_ssize_t *suboffsets
193
194      An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`.
195      If ``suboffsets[n] >= 0``, the values stored along the nth dimension are
196      pointers and the suboffset value dictates how many bytes to add to each
197      pointer after de-referencing. A suboffset value that is negative
198      indicates that no de-referencing should occur (striding in a contiguous
199      memory block).
200
201      If all suboffsets are negative (i.e. no de-referencing is needed), then
202      this field must be ``NULL`` (the default value).
203
204      This type of array representation is used by the Python Imaging Library
205      (PIL). See `complex arrays`_ for further information how to access elements
206      of such an array.
207
208      The suboffsets array is read-only for the consumer.
209
210   .. c:member:: void *internal
211
212      This is for use internally by the exporting object. For example, this
213      might be re-cast as an integer by the exporter and used to store flags
214      about whether or not the shape, strides, and suboffsets arrays must be
215      freed when the buffer is released. The consumer MUST NOT alter this
216      value.
217
218.. _buffer-request-types:
219
220Buffer request types
221====================
222
223Buffers are usually obtained by sending a buffer request to an exporting
224object via :c:func:`PyObject_GetBuffer`. Since the complexity of the logical
225structure of the memory can vary drastically, the consumer uses the *flags*
226argument to specify the exact buffer type it can handle.
227
228All :c:data:`Py_buffer` fields are unambiguously defined by the request
229type.
230
231request-independent fields
232~~~~~~~~~~~~~~~~~~~~~~~~~~
233The following fields are not influenced by *flags* and must always be filled in
234with the correct values: :c:member:`~Py_buffer.obj`, :c:member:`~Py_buffer.buf`,
235:c:member:`~Py_buffer.len`, :c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`.
236
237
238readonly, format
239~~~~~~~~~~~~~~~~
240
241   .. c:macro:: PyBUF_WRITABLE
242
243      Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter
244      MUST provide a writable buffer or else report failure. Otherwise, the
245      exporter MAY provide either a read-only or writable buffer, but the choice
246      MUST be consistent for all consumers.
247
248   .. c:macro:: PyBUF_FORMAT
249
250      Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST
251      be filled in correctly. Otherwise, this field MUST be ``NULL``.
252
253
254:c:macro:`PyBUF_WRITABLE` can be \|'d to any of the flags in the next section.
255Since :c:macro:`PyBUF_SIMPLE` is defined as 0, :c:macro:`PyBUF_WRITABLE`
256can be used as a stand-alone flag to request a simple writable buffer.
257
258:c:macro:`PyBUF_FORMAT` can be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`.
259The latter already implies format ``B`` (unsigned bytes).
260
261
262shape, strides, suboffsets
263~~~~~~~~~~~~~~~~~~~~~~~~~~
264
265The flags that control the logical structure of the memory are listed
266in decreasing order of complexity. Note that each flag contains all bits
267of the flags below it.
268
269.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|
270
271+-----------------------------+-------+---------+------------+
272|  Request                    | shape | strides | suboffsets |
273+=============================+=======+=========+============+
274| .. c:macro:: PyBUF_INDIRECT |  yes  |   yes   | if needed  |
275+-----------------------------+-------+---------+------------+
276| .. c:macro:: PyBUF_STRIDES  |  yes  |   yes   |    NULL    |
277+-----------------------------+-------+---------+------------+
278| .. c:macro:: PyBUF_ND       |  yes  |   NULL  |    NULL    |
279+-----------------------------+-------+---------+------------+
280| .. c:macro:: PyBUF_SIMPLE   |  NULL |   NULL  |    NULL    |
281+-----------------------------+-------+---------+------------+
282
283
284.. index:: contiguous, C-contiguous, Fortran contiguous
285
286contiguity requests
287~~~~~~~~~~~~~~~~~~~
288
289C or Fortran :term:`contiguity <contiguous>` can be explicitly requested,
290with and without stride information. Without stride information, the buffer
291must be C-contiguous.
292
293.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|l|
294
295+-----------------------------------+-------+---------+------------+--------+
296|  Request                          | shape | strides | suboffsets | contig |
297+===================================+=======+=========+============+========+
298| .. c:macro:: PyBUF_C_CONTIGUOUS   |  yes  |   yes   |    NULL    |   C    |
299+-----------------------------------+-------+---------+------------+--------+
300| .. c:macro:: PyBUF_F_CONTIGUOUS   |  yes  |   yes   |    NULL    |   F    |
301+-----------------------------------+-------+---------+------------+--------+
302| .. c:macro:: PyBUF_ANY_CONTIGUOUS |  yes  |   yes   |    NULL    | C or F |
303+-----------------------------------+-------+---------+------------+--------+
304| :c:macro:`PyBUF_ND`               |  yes  |   NULL  |    NULL    |   C    |
305+-----------------------------------+-------+---------+------------+--------+
306
307
308compound requests
309~~~~~~~~~~~~~~~~~
310
311All possible requests are fully defined by some combination of the flags in
312the previous section. For convenience, the buffer protocol provides frequently
313used combinations as single flags.
314
315In the following table *U* stands for undefined contiguity. The consumer would
316have to call :c:func:`PyBuffer_IsContiguous` to determine contiguity.
317
318.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|l|l|l|
319
320+-------------------------------+-------+---------+------------+--------+----------+--------+
321|  Request                      | shape | strides | suboffsets | contig | readonly | format |
322+===============================+=======+=========+============+========+==========+========+
323| .. c:macro:: PyBUF_FULL       |  yes  |   yes   | if needed  |   U    |     0    |  yes   |
324+-------------------------------+-------+---------+------------+--------+----------+--------+
325| .. c:macro:: PyBUF_FULL_RO    |  yes  |   yes   | if needed  |   U    |  1 or 0  |  yes   |
326+-------------------------------+-------+---------+------------+--------+----------+--------+
327| .. c:macro:: PyBUF_RECORDS    |  yes  |   yes   |    NULL    |   U    |     0    |  yes   |
328+-------------------------------+-------+---------+------------+--------+----------+--------+
329| .. c:macro:: PyBUF_RECORDS_RO |  yes  |   yes   |    NULL    |   U    |  1 or 0  |  yes   |
330+-------------------------------+-------+---------+------------+--------+----------+--------+
331| .. c:macro:: PyBUF_STRIDED    |  yes  |   yes   |    NULL    |   U    |     0    |  NULL  |
332+-------------------------------+-------+---------+------------+--------+----------+--------+
333| .. c:macro:: PyBUF_STRIDED_RO |  yes  |   yes   |    NULL    |   U    |  1 or 0  |  NULL  |
334+-------------------------------+-------+---------+------------+--------+----------+--------+
335| .. c:macro:: PyBUF_CONTIG     |  yes  |   NULL  |    NULL    |   C    |     0    |  NULL  |
336+-------------------------------+-------+---------+------------+--------+----------+--------+
337| .. c:macro:: PyBUF_CONTIG_RO  |  yes  |   NULL  |    NULL    |   C    |  1 or 0  |  NULL  |
338+-------------------------------+-------+---------+------------+--------+----------+--------+
339
340
341Complex arrays
342==============
343
344NumPy-style: shape and strides
345~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
346
347The logical structure of NumPy-style arrays is defined by :c:member:`~Py_buffer.itemsize`,
348:c:member:`~Py_buffer.ndim`, :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides`.
349
350If ``ndim == 0``, the memory location pointed to by :c:member:`~Py_buffer.buf` is
351interpreted as a scalar of size :c:member:`~Py_buffer.itemsize`. In that case,
352both :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are ``NULL``.
353
354If :c:member:`~Py_buffer.strides` is ``NULL``, the array is interpreted as
355a standard n-dimensional C-array. Otherwise, the consumer must access an
356n-dimensional array as follows:
357
358.. code-block:: c
359
360   ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];
361   item = *((typeof(item) *)ptr);
362
363
364As noted above, :c:member:`~Py_buffer.buf` can point to any location within
365the actual memory block. An exporter can check the validity of a buffer with
366this function:
367
368.. code-block:: python
369
370   def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
371       """Verify that the parameters represent a valid array within
372          the bounds of the allocated memory:
373              char *mem: start of the physical memory block
374              memlen: length of the physical memory block
375              offset: (char *)buf - mem
376       """
377       if offset % itemsize:
378           return False
379       if offset < 0 or offset+itemsize > memlen:
380           return False
381       if any(v % itemsize for v in strides):
382           return False
383
384       if ndim <= 0:
385           return ndim == 0 and not shape and not strides
386       if 0 in shape:
387           return True
388
389       imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
390                  if strides[j] <= 0)
391       imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
392                  if strides[j] > 0)
393
394       return 0 <= offset+imin and offset+imax+itemsize <= memlen
395
396
397PIL-style: shape, strides and suboffsets
398~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
399
400In addition to the regular items, PIL-style arrays can contain pointers
401that must be followed in order to get to the next element in a dimension.
402For example, the regular three-dimensional C-array ``char v[2][2][3]`` can
403also be viewed as an array of 2 pointers to 2 two-dimensional arrays:
404``char (*v[2])[2][3]``. In suboffsets representation, those two pointers
405can be embedded at the start of :c:member:`~Py_buffer.buf`, pointing
406to two ``char x[2][3]`` arrays that can be located anywhere in memory.
407
408
409Here is a function that returns a pointer to the element in an N-D array
410pointed to by an N-dimensional index when there are both non-``NULL`` strides
411and suboffsets::
412
413   void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
414                          Py_ssize_t *suboffsets, Py_ssize_t *indices) {
415       char *pointer = (char*)buf;
416       int i;
417       for (i = 0; i < ndim; i++) {
418           pointer += strides[i] * indices[i];
419           if (suboffsets[i] >=0 ) {
420               pointer = *((char**)pointer) + suboffsets[i];
421           }
422       }
423       return (void*)pointer;
424   }
425
426
427Buffer-related functions
428========================
429
430.. c:function:: int PyObject_CheckBuffer(PyObject *obj)
431
432   Return ``1`` if *obj* supports the buffer interface otherwise ``0``.  When ``1`` is
433   returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` will
434   succeed.  This function always succeeds.
435
436
437.. c:function:: int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags)
438
439   Send a request to *exporter* to fill in *view* as specified by  *flags*.
440   If the exporter cannot provide a buffer of the exact type, it MUST raise
441   :c:data:`PyExc_BufferError`, set ``view->obj`` to ``NULL`` and
442   return ``-1``.
443
444   On success, fill in *view*, set ``view->obj`` to a new reference
445   to *exporter* and return 0. In the case of chained buffer providers
446   that redirect requests to a single object, ``view->obj`` MAY
447   refer to this object instead of *exporter* (See :ref:`Buffer Object Structures <buffer-structs>`).
448
449   Successful calls to :c:func:`PyObject_GetBuffer` must be paired with calls
450   to :c:func:`PyBuffer_Release`, similar to :c:func:`malloc` and :c:func:`free`.
451   Thus, after the consumer is done with the buffer, :c:func:`PyBuffer_Release`
452   must be called exactly once.
453
454
455.. c:function:: void PyBuffer_Release(Py_buffer *view)
456
457   Release the buffer *view* and decrement the reference count for
458   ``view->obj``. This function MUST be called when the buffer
459   is no longer being used, otherwise reference leaks may occur.
460
461   It is an error to call this function on a buffer that was not obtained via
462   :c:func:`PyObject_GetBuffer`.
463
464
465.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *format)
466
467   Return the implied :c:data:`~Py_buffer.itemsize` from :c:data:`~Py_buffer.format`.
468   On error, raise an exception and return -1.
469
470   .. versionadded:: 3.9
471
472
473.. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order)
474
475   Return ``1`` if the memory defined by the *view* is C-style (*order* is
476   ``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either one
477   (*order* is ``'A'``).  Return ``0`` otherwise.  This function always succeeds.
478
479
480.. c:function:: void* PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
481
482   Get the memory area pointed to by the *indices* inside the given *view*.
483   *indices* must point to an array of ``view->ndim`` indices.
484
485
486.. c:function:: int PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
487
488   Copy contiguous *len* bytes from *buf* to *view*.
489   *fort* can be ``'C'`` or ``'F'`` (for C-style or Fortran-style ordering).
490   ``0`` is returned on success, ``-1`` on error.
491
492
493.. c:function:: int PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order)
494
495   Copy *len* bytes from *src* to its contiguous representation in *buf*.
496   *order* can be ``'C'`` or ``'F'`` or ``'A'`` (for C-style or Fortran-style
497   ordering or either one). ``0`` is returned on success, ``-1`` on error.
498
499   This function fails if *len* != *src->len*.
500
501
502.. c:function:: void PyBuffer_FillContiguousStrides(int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order)
503
504   Fill the *strides* array with byte-strides of a :term:`contiguous` (C-style if
505   *order* is ``'C'`` or Fortran-style if *order* is ``'F'``) array of the
506   given shape with the given number of bytes per element.
507
508
509.. c:function:: int PyBuffer_FillInfo(Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags)
510
511   Handle buffer requests for an exporter that wants to expose *buf* of size *len*
512   with writability set according to *readonly*. *buf* is interpreted as a sequence
513   of unsigned bytes.
514
515   The *flags* argument indicates the request type. This function always fills in
516   *view* as specified by flags, unless *buf* has been designated as read-only
517   and :c:macro:`PyBUF_WRITABLE` is set in *flags*.
518
519   On success, set ``view->obj`` to a new reference to *exporter* and
520   return 0. Otherwise, raise :c:data:`PyExc_BufferError`, set
521   ``view->obj`` to ``NULL`` and return ``-1``;
522
523   If this function is used as part of a :ref:`getbufferproc <buffer-structs>`,
524   *exporter* MUST be set to the exporting object and *flags* must be passed
525   unmodified. Otherwise, *exporter* MUST be ``NULL``.
526