python - 从python运行c++函数
问题描述
我正在尝试使用 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:类型必须有存储信息。关于我需要改变什么的任何想法?
解决方案
该错误实际上是由您的调用引发的,ctypes.pointer
而不是pyueye
. 具体来说,gpioConfiguration
是一个_ctypes.PyCStructType
而不是一个实例。(这就是“必须有存储”的意思,也就是说,在获得指向它的指针之前,您实际上必须存储看起来像该结构的东西。这可能来自 c++,但 ctypes 认为结构是比如你必须实例化的类。文档。
所以如果你真的需要一个指针,你必须这样做:
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 中你真的不需要,而且没有人认为你应该把它们放进去)
推荐阅读
- docker - 如何根据现有的复制控制器进行部署或滚动更新?
- java - 在 Eclipse 中处理不同的源文件夹
- cmake - 如何取消设置 CMake 属性?
- java - 在 WebView 上将 EditText 与 loadUrl 相结合
- android - 基于 Qt 的 android 应用程序在一台特定设备上启动时崩溃。“dlopen 失败:libqtforandroid”
- c# - 如何在“新邮件”按钮附近为 Outlook-Addin 创建一个复选框
- maven - Maven 发布插件用户输入安全
- c++ - grpc 服务器端向客户端推送消息
- c# - 多个异步调用,调用之间有暂停
- javascript - ReCaptcha 的 React Native 替代方案