如何使用ctypes在python中正确包装C API?

时间:2017-07-07 21:04:58

标签: python c ctypes wrapping

我使用ctypes从Python中的C库中包装了两个API。一个有效,另一个没有。我的问题是:如何使用ctypes从Python中的C库正确包装API?

一些背景信息:

import ctypes 
from ctypes import *

MF = (b'path_to_file') 
beginTime = (-Value)
endTime = (Value)
PN = (b'path_to_String')
DT_RETURNGMT = 0x0100
DT_FLOAT = 0x0001
convert = DT_RETURNGMT|DT_FLOAT

这个有效:

#read functions
dll.openFile.argtypes = c_char_p,
dll.openFile.restype = POINTER(File)

dll.freeFile.argtypes = POINTER(File),
dll.freeFile.restype = None
f = dll.openFile(MF)
print(f[0].fileInfo[0].items)

这个没有:

#retrieve data
dll.readSP.argtypes = POINTER(File), c_char_p(PN), 
c_double(beginTime), c_double(endTime),
0, 0, 
c_ushort(convert),
dll.readSP.restype = POINTER(SP)
#pointer to the SP file structure 
g = dll.readSP(f, MF)
print(g)
print(g[0].points)
pint(g[0].tStamp[0].data[0].TTag)

我认为指针是正确的,因为当我告诉代码打印(g)时,它返回我的SP对象的位置,如下所示:

<__main__.LP_SP object at 0x000001D1EAB862C8>

但它无法返回SP文件结构中任何其他内容的位置。这让我相信这是我如何包装API的问题。但我不知道我哪里出错了。

我认为我不能正确包装API,但我不确定我哪里出错了。 double * refTIME和struct TimeTage * refGMT在C代码中为NULL,所以我在脚本中将它们设为0。

1 个答案:

答案 0 :(得分:0)

您已在非工作代码中定义实例而非类型。而不是:

dll.readSP.argtypes = POINTER(File), c_char_p(PN), c_double(beginTime), c_double(endTime), 0, 0, c_ushort(convert),

你需要:

dll.readSP.argtypes = POINTER(File), c_char_p, c_double, c_double, c_double, POINTER(TTag), c_ushort