I haven't tried myself but my guess the problem is that your C++
function does not acquire the GIL. When ctypes invokes a native
function, it releases the GIL.

On Wed, Oct 28, 2020 at 4:29 AM James Thomas <jamesjoetho...@gmail.com> wrote:
>
> Hi,
>
> I am trying to run the following simple example after pip installing pandas 
> and pyarrow:
>
> ---cube.cpp---
> #include <Python.h>
> #include <arrow/python/pyarrow.h>
> #include <arrow/api.h>
>
> extern "C" void print_is_array(PyObject *);
>
> void print_is_array(PyObject *obj) {
>   arrow::py::import_pyarrow();
>   printf("is_array: %d\n", arrow::py::is_array(obj));
> }
>
> ---cube.py---
> import ctypes
> import pandas as pd
> import pyarrow as pa
>
> c_lib = ctypes.CDLL("./libcube.so")
> df = pd.DataFrame({"a": [1, 2, 3]})
> table = pa.Table.from_pandas(df)
> c_lib.print_is_array(ctypes.py_object(table))
>
> ---build.sh---
> #!/bin/bash
> python3 -c 'import pyarrow; pyarrow.create_library_symlinks()'
> INC=$(python3 -c 'import pyarrow; print(pyarrow.get_include())')
> LIB=$(python3 -c 'import pyarrow; print(pyarrow.get_library_dirs()[0])')
> g++ -I$INC -I/usr/include/python3.6m -fPIC cube.cpp -shared -o libcube.so 
> -L$LIB -larrow -larrow_python
>
> When I run build.sh and then do python3 cube.py, I am seeing a segfault at 
> the import_pyarrow() statement in cube.cpp. Am I doing something wrong here?
>
> Thanks,
> James

Reply via email to