运行 来自 python 的 c++ 函数

Run c++ function from python

我正在尝试使用 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。 关于我需要更改的内容有什么想法吗?

错误实际上是由您调用 ctypes.pointer 而不是 pyueye 引发的。具体来说,gpioConfiguration 是一个 _ctypes.PyCStructType 而不是 实例 。 (这就是 'must have storage' 的意思,即你实际上必须存储一些看起来像那个结构的东西,然后才能获得指向它的指针。这可能有点奇怪来自 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 中你 真的 不需要并且没有人认为你应该把它们放在里面)