在python中的PyArrow与C+中的Arrow接口时,如何将PyArrow表转换为Arrow表+; 我有一个C++库,它是针对Apache箭头C++库构建的,它使用pyBin绑定到Python。我希望能够在C++中编写一个用Py箭头构造的表,比如: void test(arrow::Table test);

在python中的PyArrow与C+中的Arrow接口时,如何将PyArrow表转换为Arrow表+; 我有一个C++库,它是针对Apache箭头C++库构建的,它使用pyBin绑定到Python。我希望能够在C++中编写一个用Py箭头构造的表,比如: void test(arrow::Table test);,python,c++,pybind11,pyarrow,apache-arrow,Python,C++,Pybind11,Pyarrow,Apache Arrow,传入PyArrow表,如: tab = pa.Table.from_pandas(df) mybinding.test(tab) 如果我像上面那样做一个简单的函数,我会得到: TypeError: arrow_test(): incompatible function arguments. The following argument types are supported: 1. (arg0: arrow::Table) -> None Invoked with: pyarr

传入PyArrow表,如:

tab = pa.Table.from_pandas(df)
mybinding.test(tab)
如果我像上面那样做一个简单的函数,我会得到:

TypeError: arrow_test(): incompatible function arguments. The following argument types are supported:
    1. (arg0: arrow::Table) -> None

Invoked with: pyarrow.Table
我还尝试编写了一个函数,该函数接受
py::object
.cast()
但我无法执行强制转换:

RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)

有人知道如何让它工作吗?

您必须使用
arrow/python/pyarrow.h
标题中提供的功能。这个头是自动生成的,支持解开Cython <代码> Py箭头。表< /COD>对象到C++ >代码>箭头::表< /Cord>实例。构建并链接到
libarrow.so就足够了。它还需要加载
pyarrow
python包,但这只是一个运行时依赖项,而不是编译时依赖项

// header that 
#include <arrow/python/pyarrow.h>

// Ensure that the Python module was loaded
arrow::py::import_pyarrow();

PyObject* pyarrow_table = …
// With pybind11 you can also use
// pybind11::object pyarrow_table = …

// Convert PyObject* to native C++ object
std::shared_ptr<Table> table = unwrap_pyarrow_table(pyarrow_table);
//头
#包括
//确保已加载Python模块
arrow::py::import_pyarrow();
PyObject*pyarrow_表=…
//使用pybind11,您还可以使用
//pybind11::对象pyarrow\u表=…
//将PyObject *转换为本机C++对象
std::shared_ptr table=展开_pyarrow_table(pyarrow_table);

我想您需要打开
pyarrow.Table
,请参阅@Arthur this works,谢谢!不过这有点烦人,因为我需要链接pyarrow的库,而不是在cpp端包含一些内容。如果我在python/Cython端这样做,如何将unwrap_Pyarow_table()返回的共享_ptr[CTable]转换为共享_ptr
unwrap_Pyarow_table
也可以作为Cython函数使用,你可以简单地使用这个。由于
pyarrow
也使用Cython,因此您可以查看其源代码以获取示例用法。