运行 来自 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 中你 真的 不需要并且没有人认为你应该把它们放在里面)
我正在尝试使用 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 中你 真的 不需要并且没有人认为你应该把它们放在里面)