2

我有一个 C++ 库,它是针对 Apache Arrow C++ 库构建的,并使用 Pybind 绑定到 python。我希望能够在 C++ 中编写一个函数来获取一个用 PyArrow 构建的表,例如:

void test(arrow::Table test);

传入 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

我还尝试编写一个需要 a 的函数,py::object.cast<arrow::Table>()我无法进行强制转换:

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

有谁知道如何让它工作?

4

1 回答 1

1

您必须使用arrow/python/pyarrow.h标题中提供的功能。此标头是自动生成的,以支持将 Cythonpyarrow.Table对象解包到 C++arrow::Table实例。构建和链接到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);
于 2019-09-12T12:45:14.383 回答