diff --git a/python/pyarrow/src/arrow/python/common.cc b/python/pyarrow/src/arrow/python/common.cc index a6d963b9b4e4..2009f0925906 100644 --- a/python/pyarrow/src/arrow/python/common.cc +++ b/python/pyarrow/src/arrow/python/common.cc @@ -236,7 +236,8 @@ Result> PyBuffer::FromPyObject(PyObject* obj) { } PyBuffer::~PyBuffer() { - if (data_ != nullptr) { + // GH-38626: destructor may be called after the Python interpreter is finalized. + if (Py_IsInitialized() && data_ != nullptr) { PyAcquireGIL lock; PyBuffer_Release(&py_buf_); } diff --git a/python/pyarrow/src/arrow/python/numpy_convert.cc b/python/pyarrow/src/arrow/python/numpy_convert.cc index 4113cc67d2fc..fbbfccc871cb 100644 --- a/python/pyarrow/src/arrow/python/numpy_convert.cc +++ b/python/pyarrow/src/arrow/python/numpy_convert.cc @@ -53,8 +53,11 @@ NumPyBuffer::NumPyBuffer(PyObject* ao) : Buffer(nullptr, 0) { } NumPyBuffer::~NumPyBuffer() { - PyAcquireGIL lock; - Py_XDECREF(arr_); + // GH-38626: destructor may be called after the Python interpreter is finalized. + if (Py_IsInitialized()) { + PyAcquireGIL lock; + Py_XDECREF(arr_); + } } #define TO_ARROW_TYPE_CASE(NPY_NAME, FACTORY) \