如何使用 ctypes 在 python 中正确包装 C API?
how to properly wrap C API in python using ctypes?
我已经使用 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)时,它return是我的 SP 对象的位置,如下所示:
<__main__.LP_SP object at 0x000001D1EAB862C8>
但它无法 return SP 文件结构中任何其他内容的位置。这让我相信这是我如何包装 API 的问题所在。但我不确定我哪里出错了。
我认为我一定没有正确包装 API 但我不确定哪里出错了。 double *refTIME 和 struct TimeTage *refGMT 在 C 代码中为 NULL,因此我在脚本中将它们设为 0。
您在非工作代码中定义了 instances 而不是 types。而不是:
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
我已经使用 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)时,它return是我的 SP 对象的位置,如下所示:
<__main__.LP_SP object at 0x000001D1EAB862C8>
但它无法 return SP 文件结构中任何其他内容的位置。这让我相信这是我如何包装 API 的问题所在。但我不确定我哪里出错了。
我认为我一定没有正确包装 API 但我不确定哪里出错了。 double *refTIME 和 struct TimeTage *refGMT 在 C 代码中为 NULL,因此我在脚本中将它们设为 0。
您在非工作代码中定义了 instances 而不是 types。而不是:
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