Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python访问DLL中的数组_Python_Arrays_Pointers_Ctypes - Fatal编程技术网

从Python访问DLL中的数组

从Python访问DLL中的数组,python,arrays,pointers,ctypes,Python,Arrays,Pointers,Ctypes,我正在尝试从Python访问DLL中的int数组。我遵循ctypes文档页面中的指导原则,但是我得到了空指针访问异常。我的代码是: 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(PciAgen

我正在尝试从Python访问DLL中的int数组。我遵循ctypes文档页面中的指导原则,但是我得到了空指针访问异常。我的代码是:

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。

要澄清指针和数组之间的区别,请阅读comp.lang.c常见问题解答,问题6.2:

您正在从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位。数组的缓冲区是元素大小乘以长度是一种类方法,它使用dll中的数据范围(而不仅仅是副本)作为缓冲区创建实例。

要澄清指针和数组之间的区别,请阅读comp.lang.c常见问题解答,问题6.2:

您正在从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位。数组的缓冲区是元素大小乘以长度是一种类方法,它使用dll中的数据范围(而不仅仅是副本)作为缓冲区来创建实例。

谢谢!它现在可以和数组一起工作了!无论如何,我不明白这背后的逻辑。我不知道有多少空字节,但这有什么关系呢?谢谢,埃里克森,你又帮了我一次:)不管怎样,我的python是64位的,但不是每次都是64位宽的C指针吗?如果你说指针的8字节是空的,那么指针的宽度应该大于64位?很抱歉,我会继续提问,但如果我没有错的话,PciAgentIndex实际上是指向数组第一个元素的指针。它应该是64位宽。在我的示例中,我正在用dll中的PciAgentIndex地址初始化一个“python指针”。为什么这不起作用?“python指针”和导出的地址都应为64位宽,例如“python指针”不应为空?再次感谢!你太棒了!谢谢它现在可以和数组一起工作了!无论如何,我不明白这背后的逻辑。我不知道有多少空字节,但这有什么关系呢?谢谢,埃里克森,你又帮了我一次:)不管怎样,我的python是64位的,但不是每次都是64位宽的C指针吗?如果你说指针的8字节是空的,那么指针的宽度应该大于64位?很抱歉,我会继续提问,但如果我没有错的话,PciAgentIndex实际上是指向数组第一个元素的指针。它应该是64位宽。在我的示例中,我正在用dll中的PciAgentIndex地址初始化一个“python指针”。为什么这不起作用?“python指针”和导出的地址都应为64位宽,例如“python指针”不应为空?再次感谢!你太棒了!