我正在使用pyOpenGL,OpenGL要求我通过传递指针和要传输的字节数来传输数据。
我知道python并没有像c那样在内存中存储变量。我找到了以下代码使我的程序工作:
x = [1, 2, ... ] # some list
(ctypes.c_int * len(x))(*x)
然而,我不知道它为什么会起作用(而且我并不只是想要相信我已经很幸运,因为一切都落到了记忆中)。这段代码到底在做什么?
答案 0 :(得分:5)
创建具体数组类型的推荐方法是乘以 具有正整数的任何ctypes数据类型。或者,您可以 子类此类型并定义 length 和类型类变量。 可以使用标准下标和读取和写入数组元素 切片访问;对于切片读取,结果对象本身不是 阵列。
示例:
>>> from ctypes import * >>> TenIntegers = c_int * 10 >>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) >>> print ii <c_long_Array_10 object at 0x...> >>> for i in ii: print i, ... 1 2 3 4 5 6 7 8 9 10 >>>
因此,第一部分ctypes.c_int * len(x)
创建了一个包含len(x)
元素的数组类型:
In [17]: ctypes.c_int * 10
Out[17]: __main__.c_int_Array_10
In [18]: ctypes.c_int * 100
Out[18]: __main__.c_int_Array_100
创建类型后,您应该调用它并传递数组元素:
(ctypes.c_int * len(x))(*x)
# ^^^^
创建的数组类型接受可变数量的元素,因此,您应该expand list x
using the *x
form:
In [24]: x = [1, 2, 3]
In [25]: (ctypes.c_int * len(x))(*x)
Out[25]: <__main__.c_int_Array_3 at 0x7f0b34171ae8>
In [26]: list((ctypes.c_int * len(x))(*x))
Out[26]: [1, 2, 3]
In [27]: (ctypes.c_int * len(x))(*x)[1]
Out[27]: 2
您无法传递x
,因为__init__
需要整数:
In [28]: (ctypes.c_int * len(x))(x)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-28-ff45cb7481e4> in <module>()
----> 1 (ctypes.c_int * len(x))(x)
TypeError: an integer is required (got type list)