Python使用ctypes传递参数,参数无效

Python使用ctypes传递参数,参数无效,python,c,pointers,ctypes,.so,Python,C,Pointers,Ctypes,.so,我是python新手,最近使用python编程CCD摄像头来拍照。我想使用ctypes调用.so文件中的函数。 该功能的原型是: INT is_ImageFile (HIDS hCam, UINT nCommand, void* pParam, UINT cbSizeOfParam) HIDS为uint型。官方给出的c代码示例如下: is_ImageFile(m_hCam, IS_IMAGE_FILE_CMD_SAVE, (void*)&ImageFileParams,

我是python新手,最近使用python编程CCD摄像头来拍照。我想使用ctypes调用.so文件中的函数。 该功能的原型是:

INT is_ImageFile (HIDS hCam, UINT nCommand, void* pParam, UINT cbSizeOfParam)
HIDS为uint型。官方给出的c代码示例如下:

is_ImageFile(m_hCam, IS_IMAGE_FILE_CMD_SAVE, (void*)&ImageFileParams,
                   sizeof(ImageFileParams));
其中ImageFileParams是结构类型:

typedef struct{
wchar_t* pwchFileName;
UINT     nFileType;
UINT     nQuality;
char**   ppcImageMem;
UINT*    pnImageID;
BYTE     reserved[32];}IMAGE_FILE_PARAMS;
在我的.py文件中,我尝试以以下方式定义结构:

class IMAGE_FILE_PARAMS(Structure):
_fields_=[("pwchFileNmae",c_wchar_p),("nFileType",c_uint),("nQuality",c_uint),("ppcImageMem",POINTER(c_char_p)),("pnImageID",POINTER(c_char_p)),("reserved",c_byte*32)]
ImageFileParams.pwchFileName = c_wchar_p("/home/user/aa.jpg")
ImageFileParams.nQuality=c_uint(80)
ImageFileParams.nFileType=c_uint(1)
并以这种方式定义一些成员:

class IMAGE_FILE_PARAMS(Structure):
_fields_=[("pwchFileNmae",c_wchar_p),("nFileType",c_uint),("nQuality",c_uint),("ppcImageMem",POINTER(c_char_p)),("pnImageID",POINTER(c_char_p)),("reserved",c_byte*32)]
ImageFileParams.pwchFileName = c_wchar_p("/home/user/aa.jpg")
ImageFileParams.nQuality=c_uint(80)
ImageFileParams.nFileType=c_uint(1)
然后调用函数:

is_ImageFile(hCam, IS_IMAGE_FILE_CMD_SAVE, cast(pointer(ImageFileParams),c_void_p),c_uint(sizeof(ImageFileParams)))

但我总是得到一个错误,指示参数无效。有什么问题吗?

我相信您得到的是无效参数错误,因为最后一个参数:

c_uint(sizeof(ImageFileParams))
我查看了文档,在他们的IDS网站上,我认为您需要这样称呼它(假设您导入他们的
ueye
库:

is_ImageFile(hCam, ueye.IS_IMAGE_FILE_CMD_SAVE, ImageFileParams,ueye.sizeof(ImageFileParams))

显示一个复制错误的最小完整示例,并给出完整的回溯。请看一看。我相信,您必须使用
CDLL()
调用C函数。此外,Python ctypes API无法检查您的Python绑定是否与C函数签名匹配。(如果不是这样的话,那么您只是有未定义的行为,即包括所有内容:无法识别->错误的结果->崩溃。)如果Python报告类型错误,这只是与“Python端”相关。