【问题标题】:Run c++ function from python从python运行c++函数
【发布时间】:2021-09-20 09:55:39
【问题描述】:

我正在尝试使用 pyueye 通过 python 访问我的 IDS 相机的 GPIO。原函数定义为:INT is_IO(HIDS hCam, UINT nCommand, void* pParam, UINT cbSizeOfParam)。这是一个使用示例:

Example 2

INT nRet = IS_SUCCESS;

 

IO_GPIO_CONFIGURATION gpioConfiguration;

 

// Set configuration of GPIO1 (OUTPUT LOW)

gpioConfiguration.u32Gpio = IO_GPIO_1;

gpioConfiguration.u32Configuration = IS_GPIO_OUTPUT;

gpioConfiguration.u32State = 0;

 

nRet = is_IO(hCam, IS_IO_CMD_GPIOS_SET_CONFIGURATION, (void*)&gpioConfiguration,

            sizeof(gpioConfiguration));

我正在尝试在 python 中这样做:

from pyueye import ueye
from ctypes import pointer
gpioConfiguration = ueye.IO_GPIO_CONFIGURATION 
gpioConfiguration.u32Gpio = ueye.IO_GPIO_1
gpioConfiguration.u32Configuration = ueye.IS_GPIO_OUTPUT
gpioConfiguration.u32State = 1

pt = pointer(gpioConfiguration)
stat = ueye.is_IO(hCam, ueye.IS_IO_CMD_GPIOS_SET_CONFIGURATION,byref(gpioConfiguration),ueye.sizeof(gpioConfiguration))

但我收到错误:TypeError: type must have storage info。 关于我需要改变什么的任何想法?

【问题讨论】:

    标签: python c++ ueye


    【解决方案1】:

    错误实际上是由您调用ctypes.pointer 而不是pyueye 引发的。具体来说,gpioConfiguration_ctypes.PyCStructType 而不是 instance。 (这就是“必须有存储空间”的意思,也就是说,在获得指向它的指针之前,您实际上必须存储看起来像该结构的东西。这可能有点奇怪来自 c++,但 ctypes 认为结构是比如你必须实例化的类。docs

    所以如果你真的需要一个指针,你必须这样做:

    myConfig = gpioConfiguration()
    pt = pointer(myConfig)
    # you probably want to set properties on the *instance*:
    myConfig.u32Gpio = ueue.IO_GPIO_1
    myConfig.u32State = 1
    # and then use this instance later when passing `byref`
    

    如果您只需要通过引用传递这些参数,请参阅byref 部分(尽管这也需要一个实例)。

    遗憾的是,我没有可以测试的相机(它们看起来非常有趣),所以我只能做到这一点。但希望你能得到 ueye 为你表现的语义。

    顺便说一句,你不需要在 python 中使用分号(不像在 JS 中你真的不需要,而且没有人认为你应该把它们放进去)

    【讨论】:

    • 谢谢,现在错误消失了。遗憾的是没有设置输出,但我猜这是另一个问题。当然我知道Python中没有分号,只是复制粘贴错误:D
    • @helpneeded 最新的编辑有帮助吗?
    • 遗憾的是,我不得不将 byref() 排除在外...但是使用指针和 byref 是不必要的,或者?
    • byref() 和 pointer() 是互斥的,是的。如果您不需要在任何地方重用指针,byref() 比创建指针然后传递指针更便宜。无论您采用哪种方式,您都是在在实例上设置属性,不是吗?如果您将它们设置在类上然后实例化(测试它),它们将不会继续存在。
    • 是的,我测试过,抱歉不清楚!它没有帮助,但我可能还需要事先运行一些其他功能,只是还不确定......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多