Tabla a PyObject * a través de pybind11
include <pybind11 pybind11.h="">
include <python.h>
include <iostream>
include <arrow python/pyarrow.h="">
include <arrow table.h="">
// Convertir la tabla de pyarrow a un objeto nativo C++ e imprimir su contenido
void imprimirTabla(PyObject* tablaPy)
{
// convertir el objeto pyobject a tabla
auto estado = arrow::py::unwrap_table(tablaPy);
if (!estado.ok())
{
std::cout << “Error al convertir la tabla pyarrow a tabla arrow” << std::endl;
return;
}
std::shared_ptr
std::cout << “La tabla tiene ” << tabla->num_rows() << ” filas” << std::endl;
// imprimir tabla
for (int i = 0; i < tabla->num_columns(); i++)
{
std::cout << “Columna ” << i << “: ” << tabla->column(i)->ToString() << std::endl;
}
}
PYBIND11_MODULE(df_test, m)
{
arrow::py::import_pyarrow();
m.doc() = “Extensiones de Pyarrow”;
m.def(“imprimirTabla”, &imprimirTabla);
}
Soy capaz de construir satisfactoriamente una biblioteca en c++
a través de pybind11
que acepta un PyObject*
y espero imprimir el contenido de una tabla pyarrow
pasada a ella. Sin embargo, después de convertir mi pandas.DataFrame
a una pyarrow.Table
de la siguiente manera,
convertir a tabla pyarrow
tabla = pa.Table.from_pandas(df)
import df_test
df_test.imprimirTabla(tabla)
el código muestra el siguiente error:
TypeError: imprimirTabla(): argumentos de función incompatibles. Se admiten los siguientes tipos de argumentos:
1. (arg0: _object) -> None
¿Cómo puedo convertir la tabla pyarrow.Table
a un PyObject*
?</python.h>
davy.ai
Puede convertir el
pyarrow.Table
a unPyObject*
utilizando la funciónarrow::py::wrap_table
de la siguiente manera:“`c++ table;(&table)).cast())
// Convertir tabla pyarrow a objeto nativo C++ e imprimir su contenido
void print_table(py::object py_table)
{
// convertir pyobject a tabla
std::shared_ptr
py::gil_scoped_acquire acquire;
if (!py_table.attr(“export_to_c”).call(reinterpret_cast
{
py::print(“Error: No se pudo exportar la tabla a C++\n”);
return;
}
std::cout << “La tabla tiene ” << table->num_rows() << ” filas” << std::endl;
// imprimir tabla
for (int i = 0; i < table->num_columns(); i++)
{
std::cout << “Columna ” << i << “: ” << table->column(i)->ToString() << std::endl;
}
}
PYBIND11_MODULE(df_test, m)
{
arrow::py::import_pyarrow();
m.doc() = “Extensiones Pyarrow”;
m.def(“print_table”, &print_table);
}
“`
En este código actualizado, primero adquirimos el candado global del intérprete de Python (GIL) utilizando
py::gil_scoped_acquire
para garantizar la seguridad de subprocesos. Luego utilizamos la funciónpy_table.attr("export_to_c")
para exportar elpyarrow.Table
a unstd::shared_ptr<arrow::table>
de C++ y pasarlo a la funciónprint_table
. Tenga en cuenta que tuvimos que convertir el puntero auintptr_t
para evitar advertencias del compilador.