0

我正在尝试通过 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。

4

1 回答 1

1

使用位置参数初始化 ctypes 数组。初始值可以是 ctypes 数据对象、与简单数据类型兼容的 Python 对象(对于简单类型的数组,例如c_int * 20),或用于创建要复制的数组数据类型的临时实例的位置参数元组( memcpy) 进入数组。

由于您需要一个关键字参数来选择正确的转换器,因此您必须调用MyValue手动创建临时实例,或者调用setattr未初始化数组的每个项目。对于前者,您可以将生成器表达式与*解包结合使用**(参见教程):

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 的支持会很好。

于 2013-10-15T03:40:38.017 回答