es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 tabla = estado.ValueOrDie();
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>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puede convertir el pyarrow.Table a un PyObject* utilizando la función arrow::py::wrap_table de la siguiente manera:

    “`c++
    // 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 table;
    py::gil_scoped_acquire acquire;
    if (!py_table.attr(“export_to_c”).call(reinterpret_cast(&table)).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ón py_table.attr("export_to_c") para exportar el pyarrow.Table a un std::shared_ptr<arrow::table> de C++ y pasarlo a la función print_table. Tenga en cuenta que tuvimos que convertir el puntero a uintptr_t para evitar advertencias del compilador.

Comments are closed.