调用c ++库时,如何使用ctypes在Python中传递字节作为参考?

时间:2018-07-13 12:58:40

标签: python c++ pass-by-reference ctypes

我一直在尝试找出如何将某些c ++函数导入python。我让它们工作,直到其中一个功能需要其属性之一通过引用传递,而我不知道如何使它工作。 我一直在听这里的建议:https://stackoverflow.com/a/252473/7447849 直到我尝试了这个,它一直运转良好:

我具有以下c ++函数:

bool __stdcall I2CRead(int Instance,  BYTE SlaveAddress, BYTE registerAddress, BYTE* ReadBuff, BYTE Length)

那是我尝试过的代码:

i2cread_proto = ctypes.WINFUNCTYPE (ctypes.c_bool, ctypes.c_int, ctypes.c_byte, ctypes.c_byte, ctypes.c_byte, ctypes.c_byte)
i2cread_Params = (1, "instance", 0),(1, "SlaveAddress", 0),(1, "registerAddress", 0),(1, "ReadBuff", 0),(1, "Length", 0), # (parameter direction (1 for input, 2 for output), parameter name, default value)

i2cread = i2cread_proto (("I2CRead", qsfp_lib), i2cread_Params)

readBuff = ctypes.c_byte(0)

if (i2cread(0, 160, address, readBuff, 1)==True):
    print(readBuff)
else:
    print('Could not read data')

此代码有效,但readBuff保留给定的默认值,而不是应更改的值。

我尝试使用byref(),但仍然无法正常工作(这给我一个错误的类型错误)。

关于我的任何见解可能做错了吗?我对Python不太熟练,所以也许我误会了一个概念

1 个答案:

答案 0 :(得分:0)

未经测试。确保对参数使用正确的类型。

from ctypes import *
dll = WinDLL('dllname')
dll.I2CRead.argtypes = c_int,c_ubyte,c_ubyte,POINTER(c_ubyte),c_ubyte
dll.I2CRead.restype = c_bool

output = (c_ubyte * 256)()  # Create instance of a c_ubyte array to store the output.
result = dll.I2CRead(1,2,3,output,len(output))