我正在尝试理解ctypes。我有一个C结构(zmsg_t),我希望用Python语言创建,然后从Python语言返回到C语言。
因此,从C调用Python方法需要返回一个对象,然后我们在C中再次处理该对象。
我有一个用于访问和创建C方法和结构的绑定,因此在Python中我可以调用Zmsg()构造函数。我现在需要退还这个。
我的python测试方法很简单:
def actor_test(*args, **kwargs):
print("test")
msg = Zmsg()
frame = Zframe(b"Hello", 5)
msg.prepend(frame)
return msg
该方法从C中调用,如下所示:
PyObject *pReturn = PyObject_CallObject(pFunc, NULL);
这将正确地调用该方法。然而,返回的对象当然是一个PyObject*。调试器说它是
"<czmq._czmq_ctypes.Zmsg object at 0x7ffff5f18e50>" PyObject
[class] "<class 'czmq._czmq_ctypes.Zmsg'>"
[super class] "<class 'object'>"
[meta type] "<class 'type'>"
ob_refcnt 1 Py_ssize_t
如何将其恢复为原始的C类型(zmsg_t *)
真的很感谢任何人的帮助。
Zmsg的ctype定义可以在here中看到
发布于 2019-10-31 06:06:06
我会尝试使用return byref(msg)
并执行一些C强制转换,并注意垃圾收集。但是tbh我通常从python进程调用c。
发布于 2020-01-15 03:33:47
正如python邮件列表指出的那样,我回答了自己的问题,因为这个问题是错误的。它混合了ctypes和CPython API。最好的方法是使用一种方法。因为要嵌入Python,所以最好的方法是使用CPython API包装成C方法。这样,当Python返回时,您将在C中使用自己定义的Python对象,并可以访问其内部结构。
This tutorial详细描述了如何将C结构包装成Python对象。
https://stackoverflow.com/questions/58633540
复制相似问题