python 结构体数组_将结构数组从Python传递给C
[更新:问题已解决!参见文章底部]
我需要允许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相关推荐
- C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026
然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意
- Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...
- C#中结构体定义并转换字节数组
ref: https://www.cnblogs.com/dafanjoy/p/7818126.html C#中结构体定义并转换字节数组 最近的项目在做socket通信报文解析的时候,用到了结构体与字 ...
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- c++结构体总结(结构体定义,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中 const使用场景)
看完b站黑马程序员之后的借鉴和笔记 1.什么是结构体,有什么作用? 在C/C++中,结构体是用户定义的数据类型.它可以把几种不同类型的数据项集合成结构体这样一个单一类型. 2. 结构体定义和使用 #i ...
- c++ 结构体初始化_【干货】c语言基础语法——结构体
1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...
- c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事
一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...
- python 结构体指针_C语言结构体指针(指向结构体的指针)详解
当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...
- c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧
单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...
最新文章
- SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
- 从技术角度分析“抢票软件的加速”有多快?
- JS监听手机物理返回键,返回到指定页面
- python 数据分析学什么-python数据分析师要学什么
- Scala,Spark和IDEA学习笔记
- Rsync+inotify搭建实时同步系统
- 编辑php程序推荐的软件,PHP程序员都爱用的开发工具推荐
- docker的核心原理-cgroup
- 64位win10下安装xgboost python包的教程
- 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
- 小程序 实现两种导航功能
- 爬取CSDN官方博客粉丝中码龄20年以上的用户数量
- DM8:dexpdimp-逻辑导出--逻辑导入
- 信息技术课件认识计算机ppt课件ppt,小学信息技术课件-认识计算机课件PPT课件.ppt...
- 代码粘贴到word文档的美化网站
- 使用pyinstall将python+qt的py文件打包为exe
- RK3566调整LCD的背光PWM通道
- 播放器的书签--推荐使用Potplayer
- MT6739 camera AF驱动移植
- 易基因项目文章|ChIP-seq揭示H3K27me3去甲基化酶在体细胞重编程调控转录机制