从 cffi 函数返回一个普通的 Python 字符串?

Return a normal Python string from cffi function?

提问人:fisherdog1 提问时间:9/14/2023 最后编辑:fisherdog1 更新时间:9/14/2023 访问量:47

问:

cffi 的解释给出了一个示例,说明如何声明一个返回浮点数的 C 函数。您也可以声明它以返回 .我改编了这个玩具示例:char*

# my_ffi.py
...

ffibuilder.cdef("""
    char * my_cfun(void);
""")

...

如果我这样做,那么我需要在调用站点使用以下 Python 将其恢复为 Python 字符串:

# user.py
from _my_ffi import ffi, lib

print(ffi.string(lib.my_cfun()))

如何声明它,以便调用 Python 代码看到一个普通的 Python 字符串,从而不需要转换?我尝试使用 PyObject * 作为返回类型,但这会导致 cdef 无法解析它:

cffi.CDefError: cannot parse "PyObject * my_cfun(void);"

这个应用程序的可谷歌性非常糟糕......我怀疑有一种完全不同的方式来回传递 python 对象,但我也肯定在 C 中看到了包含 PyObject 的函数签名。

蟒蛇 C python-cffi

评论

0赞 relent95 9/14/2023
请参阅如何提问。做一个初步的研究。请参阅转化。CFFI 没有您想要的功能。无论如何,为什么不创建一个进行转换的包装器呢?或者,如果您使用自己的 C 模块,则可以创建 Python C 扩展

答:

1赞 Armin Rigo 9/14/2023 #1

就像 relent95 说的,答案是编写这个 Python 函数:

def stuff():
    return ffi.string(lib.my_cfunc())
0赞 fisherdog1 9/14/2023 #2

这似乎不是cffi的一个特点。我能够准确地得到我对 C 扩展的想象,例如这个答案:编译器找不到 Py_InitModule() .. 它是否已弃用,如果是这样,我应该使用什么?

这与 Lua C API 更相似,但似乎与 cffi 无关。我还发现了我还没有尝试过的 ctypes。