[更新:问题已解决!参见文章底部]

我需要允许Python开发人员将一组打包数据(在这种情况下)通过API插入到API中,这是通过Python C API手动暴露的一系列C++接口。我的初步印象是使用ctypes Structure类来实现这样的接口:class Vertex(Structure):

_fields_ = [

('x', c_float),

('y', c_float),

('z', c_float),

('u', c_float),

('v', c_float),

('color', c_int)

]

verts = (Vertex * 3)()

verts[0] = Vertex(0.0, 0.5, 0.0, 0.0, 0.5, 0xFF0000FF)

verts[1] = Vertex(0.5, -0.5, 0.0, 0.5, -0.5, 0x00FF00FF)

verts[2] = Vertex(-0.5, -0.5, 0.0, -0.5, -0.5, 0x0000FFFF)

device.ReadVertices(verts, 3) # This is the interfaces to the C++ object

其中我要传递给的函数具有以下签名:

^{pr2}$

Python包装器如下所示:static PyObject* Device_ReadVertices(Py_Device* self, PyObject* args)

{

PyObject* py_verts;

int count;

if(!PyArg_ParseTuple(args, "Oi", &py_verts, &count))

return NULL;

// This Doesn't Work!

Vertex* verts = static_cast(PyCObject_AsVoidPtr(py_verts));

self->device->ReadVertices(verts, count);

Py_RETURN_NONE;

}

当然,我遇到的最大问题是:我可以检索结构的PyObject,但我不知道如何将其转换为正确的类型。上面的代码失败得很惨。那么,我到底该如何允许用户从Python传递这种数据呢?在

现在,有两件事要考虑:首先,我已经有了相当多的Python/C++层,我对它非常满意(我远离SWIG,这样我可以有更多的灵活性)。我不想重新编写代码,所以我更喜欢一个与C API本机工作的解决方案。其次,我确实希望在我的C++代码中预先定义顶点结构,所以我不希望用户需要在Python中重新定义它(这样减少错误),但是我不知道如何暴露这样一个连续的结构。第三,我没有理由尝试ctypes结构,除了不知道另一种方法。欢迎提出任何建议。最后,由于这是一个图形应用程序(你可能已经猜到了),我更喜欢一个更快的方法,而不是一个方便的方法,即使更快的方法需要更多的工作。在

谢谢你的帮助!我仍然对python扩展有自己的看法,所以在一些比较棘手的部分获得社区的意见是很有帮助的。在

[解决方案]

首先,感谢每一个提出自己想法的人。最终的答案是由许多小道消息加起来的。最后,我发现了:山姆的使用建议结构包结果钱是对的。看到我使用的是Python 3,我不得不稍微调整一下,但是当我说了这么多之后,屏幕上出现了一个三角形:verts = bytes()

verts += struct.pack("fffffI", 0.0, 0.5, 0.0, 0.0, 0.5, 0xFF0000FF)

verts += struct.pack("fffffI", 0.5, -0.5, 0.0, 0.5, -0.5, 0x00FF00FF)

verts += struct.pack("fffffI", -0.5, -0.5, 0.0, -0.5, -0.5, 0x0000FFFF)

device.ReadVertices(verts, 3)

现在我的元组解析如下所示:static PyObject* Device_ReadVertices(Py_Device* self, PyObject* args)

{

void* py_verts;

int len, count;

if(!PyArg_ParseTuple(args, "y#i", &py_verts, &len, &count))

return NULL;

// Works now!

Vertex* verts = static_cast(py_verts);

self->device->ReadVertices(verts, count);

Py_RETURN_NONE;

}

请注意,即使我在本例中没有使用len变量(虽然在最终产品中我会使用),但我需要使用'y#'而不是仅使用'y'来解析元组,否则它将在第一个NULL处停止(根据文档)。同样要考虑的是:像这样的void*转换是相当危险的,所以请加载比我这里显示的更多的错误检查!在

所以,干得好,快乐的一天,打包回家,是吗?在

等等!别这么快!还有更多!在

对这一切的结果感觉很好,我突发奇想,决定看看我之前的尝试是否仍然失败,并回到本文中的第一个python片段。(当然,使用新的C代码)和。。。成功了!结果与结构包版本!真 的!在

所以这意味着您的用户可以选择如何提供这类数据,并且您的代码可以不做任何更改就处理这两种数据。我个人会鼓励类型结构方法,因为我认为它更容易阅读,但实际上它是任何用户满意的。(见鬼,如果他们愿意的话,他们可以手动键入一个十六进制的字节串。它起作用了。我试过了。)

老实说,我认为这是最好的结果,所以我欣喜若狂。再次感谢大家,祝其他遇到这个问题的人好运!在

python 结构体数组_将结构数组从Python传递给C相关推荐

  1. C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026

    然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意

  2. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承

    结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...

  3. C#中结构体定义并转换字节数组

    ref: https://www.cnblogs.com/dafanjoy/p/7818126.html C#中结构体定义并转换字节数组 最近的项目在做socket通信报文解析的时候,用到了结构体与字 ...

  4. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  5. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  6. c++结构体总结(结构体定义,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中 const使用场景)

    看完b站黑马程序员之后的借鉴和笔记 1.什么是结构体,有什么作用? 在C/C++中,结构体是用户定义的数据类型.它可以把几种不同类型的数据项集合成结构体这样一个单一类型. 2. 结构体定义和使用 #i ...

  7. c++ 结构体初始化_【干货】c语言基础语法——结构体

    1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...

  8. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  9. python 结构体指针_C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...

  10. c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧

    单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...

最新文章

  1. SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
  2. 从技术角度分析“抢票软件的加速”有多快?
  3. JS监听手机物理返回键,返回到指定页面
  4. python 数据分析学什么-python数据分析师要学什么
  5. Scala,Spark和IDEA学习笔记
  6. Rsync+inotify搭建实时同步系统
  7. 编辑php程序推荐的软件,PHP程序员都爱用的开发工具推荐
  8. docker的核心原理-cgroup
  9. 64位win10下安装xgboost python包的教程
  10. 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
  11. 小程序 实现两种导航功能
  12. 爬取CSDN官方博客粉丝中码龄20年以上的用户数量
  13. DM8:dexpdimp-逻辑导出--逻辑导入
  14. 信息技术课件认识计算机ppt课件ppt,小学信息技术课件-认识计算机课件PPT课件.ppt...
  15. 代码粘贴到word文档的美化网站
  16. 使用pyinstall将python+qt的py文件打包为exe
  17. RK3566调整LCD的背光PWM通道
  18. 播放器的书签--推荐使用Potplayer
  19. MT6739 camera AF驱动移植
  20. 易基因项目文章|ChIP-seq揭示H3K27me3去甲基化酶在体细胞重编程调控转录机制

热门文章

  1. 免费阅读软件轻快阅读器怎么用
  2. Linux命令之乐--expr
  3. 一个很不错的支持Ext JS 4的上传按钮
  4. POJ 1703 Find them, Catch them【并查集】
  5. linux VM映像chroot注入修改root密码
  6. python 遍历文件 获取文件修改时间
  7. linux ssh 登陆后欢迎界面 banner 设置
  8. golang sql查询获取结果集个数
  9. golang x509包 数字证书相关介绍
  10. linux c implicit declaration of function 警告的解决方法