【问题标题】:Using C types in Python在 Python 中使用 C 类型
【发布时间】:2012-06-19 13:42:44
【问题描述】:

我需要 Python 中的以下 C 函数:

int func(Uint8 *bytRecvBuffer, int *iRecvLen);

我在 Python 中尝试过:

mydll = cdll.LoadLibrary("my.dll")

recvBuffer = None
recvLength = None

funcFunction = getattr(mydll, "func")
funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength)))

错误信息:

TypeError:需要一个整数

这里的参数有什么问题?

【问题讨论】:

    标签: python c dll ctypes


    【解决方案1】:

    您需要分配一个实际的缓冲区和整数:

    from ctypes import *
    mydll = CDLL("my")
    recvBuffer = create_string_buffer(1000)
    recvLength = c_int(1000)
    mydll.func(recvBuffer,byref(recvLength))
    

    你也可以声明func支持的具体参数,但是你也必须对传递的参数更加明确:

    mydll.func.argtypes = [POINTER(c_ubyte),POINTER(c_int)]
    mydll.func.restype = c_int
    recvBuffer = (c_ubyte*1000)()
    recvLength = c_int(1000)
    mydll.func(recvBuffer,byref(recvLength))
    

    【讨论】:

      【解决方案2】:

      None 不是整数。

      c_int(None) 导致类型错误

      用 0 来初始化你的变量,而不是 None

      【讨论】:

        【解决方案3】:

        您是否尝试使用 windll 而不是 cdll 加载 dll?还有....不是指针而不是指针吗?

        【讨论】:

        • @leon22,澄清。 POINTER(type) 接受一个类型并为该类型创建一个指针类型。 pointer(instance) 接受一个实例并实例化一个指向该实例的指针。
        【解决方案4】:

        根据您对recvBufferrecvLength 的初始化猜测您要创建空指针。

        在这种情况下,您应该创建一个没有特定类型参数的实例,请执行以下操作:

        recvBuffer = POINTER(c_ubyte)()   
        recvLength = POINTER(c_int)()
        
        funcFunction(recvBuffer, recvLength)
        

        如果您在 python 中获得了缓冲区,则需要将固定大小的数组转换为正确的指针类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-27
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          相关资源
          最近更新 更多