From f00853f39235a5eaef71595eab4548f5960ab746 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 24 May 2023 15:31:05 +0200 Subject: [PATCH] GH-34031: [Python][DRAFT] Experiment with PyCapsule for communicating C Data Interface pointers --- python/pyarrow/ipc.pxi | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/python/pyarrow/ipc.pxi b/python/pyarrow/ipc.pxi index a8398597fe6..f86f3261fb7 100644 --- a/python/pyarrow/ipc.pxi +++ b/python/pyarrow/ipc.pxi @@ -17,7 +17,7 @@ from collections import namedtuple import warnings - +cimport cpython cpdef enum MetadataVersion: V1 = CMetadataVersion_V1 @@ -814,6 +814,29 @@ cdef class RecordBatchReader(_Weakrefable): self.reader = c_reader return self + @staticmethod + def _import_from_c_capsule(stream): + cdef: + ArrowArrayStream* c_stream + shared_ptr[CRecordBatchReader] c_reader + RecordBatchReader self + + # sanity checks + if not cpython.PyCapsule_IsValid(stream, 'arrowarraystream'): + raise ValueError( + "Not an ArrayArrayStream object" + ) + c_stream = cpython.PyCapsule_GetPointer( + stream, 'arrowarraystream' + ) + + with nogil: + c_reader = GetResultValue(ImportRecordBatchReader(c_stream)) + + self = RecordBatchReader.__new__(RecordBatchReader) + self.reader = c_reader + return self + @staticmethod def from_batches(Schema schema not None, batches): """