Как привести printf () из функции C в структуру данных Python? - PullRequest
0 голосов
/ 10 июня 2018

РЕДАКТИРОВАТЬ: Этот вопрос связан с этим: Python ctypes: как передать выходные данные строки из функции C в pandas DataFrame?

Мой вопрос заключается в том, как проанализировать текст, напечатанный вSTDOUT через printf() в нечто полезное для Python.

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

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

, где input_file - это путь к файлу, index - это уже индекссгенерировано, и query_string - строка, используемая для запроса к базе данных.

Вот код Python, который у меня сейчас есть:

from ctypes import CDLL
import ctypes

lib = CDLL(".../path/libshared.so") 

lib.print_query.restype = ctypes.c_char
lib.print_query.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p)

Согласно документации, https://docs.python.org/3/library/ctypes.html

ctypes.c_char является байтовым объектом из 1 символа.Когда я пытаюсь использовать функцию lib.print_query, функция возвращает строки через printf() в STDOUT:

foo = lib.print_query('../file', '.../index', 'January')

выводит

2012 februari 32.610
2012    maart 33.195
2012    april 51.891

и print(foo) возвращает b'\x02'

Я не могу "получить доступ" к тому, что было напечатано в STDOUT, и я не уверен, как перевести это в простую строку текста.Я получаю те же результаты, пытаясь

foo = io.BytesIO(lib.print_query('../file', '.../index', 'January'))

Как я могу получить доступ к этому тексту?Было бы полезно передать это в Dataframe pandas, так как это данные, разделенные табуляцией.

РЕДАКТИРОВАТЬ: я пробовал конвейер со следующими

import subprocess
proc = subprocess.Popen(lib.print_query('../file', '.../index', 'January'), stdout=subprocess.PIPE)

Вот вывод:

FileNotFoundError: [Errno 2] No such file or directory: b'\x02': b'\x02'
...