Python ctypes:如何将C函数的行输出传递给pandas DataFrame?

时间:2018-06-09 18:13:06

标签: python c pandas ctypes python-c-api

我的问题是如何通过ctypes将C函数的制表符分隔输出解析为pandas DataFrame:

我正在使用ctypes围绕C库在Python3.x中编写Python包装器。 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访问这些函数,并将制表符分隔的行输出传递给pandas DataFrame。

我的问题是:

(1)我可以尝试解析print_query()的STDOUT;但是,这些查询可能会导致大型制表符分隔的DataFrame。我担心这个解决方案效率不高,因为它可能无法扩展到+ 10000s的行。其他问题大致涵盖了如何通过ctypes从Python中的C函数中捕获STDOUT:

Capturing print output from shared library called from python with ctypes module

(2)我可以以某种方式访问​​output,并将其传递给pandas 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)

第一个参数应该是什么,以及如何将其传递给可能是pandas DataFrame的东西?

(3)也许最好重新编写C函数,这些函数将制表符分隔的行返回到更容易通过ctypes访问的内容中?

1 个答案:

答案 0 :(得分:1)

我打算发表评论但是stackoverflow阻止了我。

1- pandas对象传递给像PyObject *这样的c函数,所以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

这些是评论和观察,而不是完整的答案......