如何产生Python ctypes实例

问题描述

我正在尝试使用pyueye库运行ML相机,并且遇到ctypes问题。一个函数需要一个'ctypes instance'类型的参数,尽管尝试了所有可能的变体,但我仍无法弄清楚如何使用ctypes库生成该参数。该库没有有关python的文档,但是我要使用的函数的C文档是:

Syntax

INT is_SetAutoparameter (HIDS hCam,INT param,double* pval1,double* pval2)

Example 1

//Enable auto gain control:

double dEnable = 1;

int ret = is_SetAutoparameter (hCam,IS_SET_ENABLE_AUTO_GAIN,&dEnable,0);

我在python中收到的代码和后续错误是:

nRet = ueye.is_SetAutoparameter(hCam,ueye.IS_SET_ENABLE_AUTO_GAIN,ctypes.byref(ctypes.c_long(1)),ctypes.byref(ctypes.c_long(0)))

Error:
ret = _is_SetAutoparameter(_hCam,_param,ctypes.byref(pval1),ctypes.byref(pval2))
TypeError: byref() argument must be a ctypes instance,not 'CArgObject'

关于ctypes实例的任何建议吗?谢谢

编辑:最小的可复制示例

from pyueye import ueye
import ctypes

class Turfcam:
    def main(self):
        turfcam.take_photo()

    def take_photo(self):
        hCam = ueye.HIDS(0)
        pval1 = ctypes.c_double(1)
        pval2 = ctypes.c_double(0)
        nRet = ueye.is_SetAutoparameter(hCam,ctypes.byref(pval2))

        # Camera Init
        nRet = ueye.is_InitCamera(hCam,None)

if __name__ == "__main__":
    turfcam = Turfcam()
    turfcam.main()

解决方法

pyueye库仅提供一些基本文档:

_is_SetAutoParameter = _bind("is_SetAutoParameter",[ctypes.c_uint,ctypes.c_int,ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_double)],ctypes.c_int)


def is_SetAutoParameter(hCam,param,pval1,pval2):
    """
    :param hCam: c_uint (aka c-type: HIDS)
    :param param: c_int (aka c-type: INT)
    :param pval1: c_double (aka c-type: double \*)
    :param pval2: c_double (aka c-type: double \*)
    :returns: success,or no success,that is the answer
    :raises NotImplementedError: if function could not be loaded
    """
    if _is_SetAutoParameter is None:
        raise NotImplementedError()

    _hCam = _value_cast(hCam,ctypes.c_uint)
    _param = _value_cast(param,ctypes.c_int)

    ret = _is_SetAutoParameter(_hCam,_param,ctypes.byref(pval1),ctypes.byref(pval2))

    return ret

包装程序正在执行byref,因此仅需要传递ctypes对象。 uEye docs说参数可以是输入或输出参数,因此请始终创建c_double对象并根据传递的函数的需要对其进行初始化。请注意,对于输出参数,您必须为对象分配一个名称,以便该对象在要查询的调用之后存在。通过直接将ctypes.c_double(value)传递给函数可以避免输入参数,但是为了保持一致,我总是为对象分配名称:

示例:

pval1 = ctypes.c_double()
pval2 = ctypes.c_double() # not used for output on IS_GET_ENABLE_AUTO_GAIN 
nRet = ueye.is_SetAutoParameter(hCam,ueye.IS_GET_ENABLE_AUTO_GAIN,pval2)
print(pval1.value) # query the returned value

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...