我试图通过ctypes将一个联合数组传递给我的C ++ DLL,我对Python很新。是否有构建它们的简便方法,例如:
class MyValue(Union):
_fields_ = [
("ftNone" , c_void_p),
("ftString", c_char_p),
("ftInt" , c_int ),
("ftBigInt", c_long ),
("ftFloat" , c_char_p)
]
MyValues = MyValue * 20
CMethod(MyValues(
('ftInt' = 12),
('ftString' = 'testing')
))
或者有更好的方法吗?我基本上想要将一个混合类型数组传递给我的DLL。
答案 0 :(得分:1)
使用位置参数初始化ctypes数组。初始值可以是ctypes数据对象,与简单数据类型兼容的Python对象(对于诸如c_int * 20
的简单类型的数组),或者用于创建数组的临时实例的位置参数元组要复制的数据类型(memcpy
)到数组中。
由于您需要一个关键字参数来选择正确的转换器,您必须调用MyValue
来手动创建临时实例,或者在单元化数组的每个项目上调用setattr
。对于前者,您可以使用生成器表达式结合*
和**
解包(请参阅tutorial):
values = [
('ftInt', 12),
('ftString', 'testing'),
]
arr = MyValues(*(MyValue(**{k: v}) for k, v in values))
这是使用setattr
在循环中更新数组的替代方法:
arr = MyValues()
for item, value in zip(arr, values):
setattr(item, *value) # note the * unpacking
在_PyCData_set
(Modules / ctypes / _ctypes.c)中添加对关键字参数dict的支持会很不错。