从Python访问DLL中的数组

时间:2013-08-09 11:24:18

标签: python arrays pointers ctypes

我正在尝试从Python访问DLL中的一组int。我遵循ctypes文档页面中的指南,但我得到Null指针访问异常。我的代码是:

if __name__ == "__main__":
    cur_dir = sys.path[0]
    os.chdir(cur_dir)
    api = CDLL("PCIE_API")
    PciAgentIndex=POINTER(c_uint32).in_dll(api, "PciAgentIndex")
    print(PciAgentIndex)
    print(PciAgentIndex[0])

我得到了:

ValueError: NULL pointer access

当我打印最后一行时。

当我通过Eclipse调试器运行此代码片段并检查PciAgentIndex的content属性时,我得到:

str: Traceback (most recent call last):
  File "C:\Program Files\eclipse\plugins\org.python.pydev_2.7.5.2013052819\pysrc\pydevd_resolver.py", line 182, in _getPyDictionary
    attr = getattr(var, n)
ValueError: NULL pointer access

我做错了什么?我在Windows上使用Python 3.3.2。

1 个答案:

答案 0 :(得分:4)

为了澄清指针与数组之间的区别,请阅读comp.lang.c常见问题解答,问题6.2:But I heard that char a[] was identical to char *a

您正在从DLL中的数据创建指针。显然,数据以4个空字节(32位Python)或8个空字节(64位Python)开头。改为使用数组:

# for a length n array
PciAgentIndex = (c_uint32 * n).in_dll(api, "PciAgentIndex")

如果需要指针,还可以转换函数指针:

PciAgentIndex = cast(api.PciAgentIndex, POINTER(c_uint32))

ctypes数据对象具有指向关联C数据的缓冲区的指针。指针的缓冲区是4或8字节,具体取决于您的Python是32位还是64位。数组的缓冲区是元素大小乘以长度。 in_dll是一个类方法,它使用DLL中的数据范围(不仅仅是副本)作为缓冲区来创建实例。