首页 > 解决方案 > Python ctypes:如何将 C 函数的行输出传递到 pandas DataFrame?

问题描述

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

我正在使用 ctypes 围绕 C 库在 Python3.x 中编写 Python 包装器。C 库当前执行数据库查询。return_query()给定文件的路径、索引和查询字符串,我正在访问的 C 函数从查询返回制表符分隔的行:

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

使用 ctypes 模块从 python 调用的共享库中捕获打印输出

(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 访问的东西?

标签: pythoncpandasctypespython-c-api

解决方案


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

1- 熊猫对象传递给像 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

这些是评论和意见,不是完整的答案....


推荐阅读