Python ctypes: как передать выходные строки из функции C в pandas DataFrame? - PullRequest
0 голосов
/ 09 июня 2018

Мой вопрос заключается в том, как проанализировать вывод с разделителями табуляции из функции C в pandas DataFrame через ctypes:

Я пишу оболочку Python в Python3.x вокруг библиотеки C, используя ctypes.В настоящее время библиотека C выполняет запросы к базе данных.Функция C, к которой я обращаюсь return_query(), возвращает строки запроса, разделенные табуляцией, с учетом пути к файлу, индекса и строки запроса:

int return_query(structname **output, const char *input_file,
                 const char *index, const char *query_string);

Как видите, я 'используя output в качестве места для хранения всех записей из запроса, при этом structname является структурой для строк

У меня также есть функция, которая печатает в STDOUT:

int print_query(const char *input_file,
                 const char *index, const char *query_string);

Моя цель - получить доступ к этим функциям через ctypes и передать выходные строки с разделителями табуляции в DataFrame pandas.

Моя проблема заключается в следующем:

(1) я мог бы попытаться проанализировать STDOUT print_query();однако эти запросы могут привести к большим разделенным табуляцией DataFrames.Я беспокоюсь, что это решение неэффективно, так как оно может не масштабироваться до + 10000 строк.Другие вопросы примерно касались того, как перехватывать STDOUT из функций C в Python через ctypes:

Получение вывода на печать из общей библиотеки, вызываемой из python, с помощью модуля ctypes

(2)Могу ли я как-нибудь получить доступ к output и передать его в DataFrame панды?В настоящее время я не уверен, как это будет работать, например,

import ctypes

lib = CDLL("../libshared.so")  ### reference to shared library, *.so

lib.return_query.restype = ctypes.c_char
lib.return_query.argtypes = (???, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p)

Каким должен быть первый аргумент, и как бы я передал его в нечто, что может быть пандой DataFrame?

(3) Возможно, было бы лучше переписать функции C, которые возвращают строки с разделителями табуляции в нечто более доступное через ctypes?

1 Ответ

0 голосов
/ 10 июня 2018

Я собирался сделать комментарий, но stackoverflow заблокировал меня от этого.

1- Объект pandas передается функциям c, таким как PyObject *, поэтому lib.return_query.argtypes = ( c_types.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p)

2 - Если вы возвращаете строки с разделителями табуляции, которые звучат больше как ctypes.c_char_p , а не lib.return_query.restype = ctypes.c_char.И ваша функция int return_query, должна быть char * return_query

Это комментарии и наблюдения, а не полный ответ ....

...