首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ctypes结构返回给C

将ctypes结构返回给C
EN

Stack Overflow用户
提问于 2019-10-31 04:57:11
回答 2查看 98关注 0票数 2

我正在尝试理解ctypes。我有一个C结构(zmsg_t),我希望用Python语言创建,然后从Python语言返回到C语言。

因此,从C调用Python方法需要返回一个对象,然后我们在C中再次处理该对象。

我有一个用于访问和创建C方法和结构的绑定,因此在Python中我可以调用Zmsg()构造函数。我现在需要退还这个。

我的python测试方法很简单:

代码语言:javascript
运行
复制
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*。调试器说它是

代码语言:javascript
运行
复制
"<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中看到

EN

回答 2

Stack Overflow用户

发布于 2019-10-31 06:06:06

我会尝试使用return byref(msg)并执行一些C强制转换,并注意垃圾收集。但是tbh我通常从python进程调用c。

票数 1
EN

Stack Overflow用户

发布于 2020-01-15 03:33:47

正如python邮件列表指出的那样,我回答了自己的问题,因为这个问题是错误的。它混合了ctypes和CPython API。最好的方法是使用一种方法。因为要嵌入Python,所以最好的方法是使用CPython API包装成C方法。这样,当Python返回时,您将在C中使用自己定义的Python对象,并可以访问其内部结构。

This tutorial详细描述了如何将C结构包装成Python对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58633540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档